springboot 怎么优雅下线

简介: 在Spring Boot应用中,如果需要优雅地下线(即在应用关闭前完成一些操作,例如释放资源、保存数据等),可以使用SpringApplication.addListeners()方法来添加监听器,并在监听器中实现下线逻辑。例如:

在Spring Boot应用中,如果需要优雅地下线(即在应用关闭前完成一些操作,例如释放资源、保存数据等),可以使用SpringApplication.addListeners()方法来添加监听器,并在监听器中实现下线逻辑。例如:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApp.class);
        app.addListeners(new ApplicationShutdownListener());
        app.run(args);
    }
}

public class ApplicationShutdownListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 在这里编写下线逻辑,例如释放资源、保存数据等
        System.out.println("应用正在关闭中...");
    }
}

在上面的例子中,我们创建了一个名为ApplicationShutdownListener的监听器,并实现了ApplicationListener接口,在onApplicationEvent()方法中编写下线逻辑。然后,通过SpringApplication.addListeners()方法将该监听器添加到应用程序中,这样就可以在应用程序关闭前执行下线逻辑了。

需要注意的是,ContextClosedEvent事件表示应用程序上下文关闭事件,包括WebApplicationContextApplicationContext。因此,如果应用程序是一个Web应用程序,可以使用SpringBootServletInitializer类来启动应用程序,或者使用SpringApplication.addListeners()方法添加ContextRefreshedEventContextClosedEvent监听器,以便在应用程序启动和关闭时执行相应的操作。


那怎么触发springboot应用关闭呢?

在使用kill命令杀死进程时,可能会导致应用程序无法正常关闭,造成资源泄露等问题。因此,建议在正式环境中使用kill命令之前,先尝试使用shutdown端点进行应用程序关闭。

在Spring Boot应用程序中,可以使用/actuator/shutdown端点来进行应用程序的优雅关闭。要启用该端点,需要在pom.xml文件中添加spring-boot-starter-actuator依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

添加依赖后,/actuator/shutdown端点就会自动被添加到应用程序中。当访问该端点时,应用程序将会进行优雅关闭流程,包括释放资源、保存数据等操作。需要注意的是,为了确保安全性,访问该端点需要进行身份认证,默认情况下只有localhost才能访问该端点。

在默认情况下,可以通过POST请求/actuator/shutdown端点来关闭应用程序。例如,在终端中可以使用以下命令来关闭应用程序:

curl -X POST localhost:8080/actuator/shutdown

actuator/shutdown 背后的原理是什么

/actuator/shutdown端点的背后原理是通过EndpointShutdownEndpoint两个类实现的。

Endpoint是Spring Boot提供的一种扩展机制,用于暴露应用程序的一些信息或操作。通常情况下,需要自定义Endpoint类并继承AbstractEndpoint,然后在应用程序中注册该Endpoint。例如:

@Component
public class MyEndpoint extends AbstractEndpoint<String> {
    public MyEndpoint() {
        super("my-endpoint");
    }

    @Override
    public String invoke() {
        // 在这里编写Endpoint的逻辑
        return "Hello, World!";
    }
}

在上面的例子中,我们创建了一个名为MyEndpointEndpoint类,并继承了AbstractEndpoint<String>类。在构造方法中,我们调用了父类的构造方法,并传递了Endpoint的ID。在invoke()方法中,我们编写了Endpoint的逻辑,并返回了一个字符串。然后,在应用程序中,可以使用@EndpointWebExtension@EndpointExtension注解来扩展Endpoint的功能。

ShutdownEndpoint则是Spring Boot提供的一个内置Endpoint,用于实现应用程序的优雅关闭。当访问/actuator/shutdown端点时,ShutdownEndpoint会自动调用SpringApplication.exit()方法,触发应用程序的关闭流程,包括释放资源、保存数据等操作。为了确保安全性,在默认情况下,访问/actuator/shutdown端点需要进行身份认证,只有localhost才能访问该端点。

在实现自定义Endpoint时,可以参考ShutdownEndpoint的实现方式,并使用SpringApplication.exit()方法来触发应用程序的关闭流程。需要注意的是,在实际应用中,应该根据实际情况来选择使用内置Endpoint还是自定义Endpoint来实现应用程序的优雅关闭。

目录
相关文章
|
负载均衡 监控 Dubbo
Spring boot 2.3优雅下线,距离生产还有多远?
对于任何一个线上应用,如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求,这使得无损下线成为应用生命周期中必不可少的一个环节。
17623 4
Spring boot 2.3优雅下线,距离生产还有多远?
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
144 1
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
152 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
2月前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
230 1
|
18天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
16天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
19天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
218 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
41 3
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
151 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统