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优雅下线,距离生产还有多远?
对于任何一个线上应用,如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求,这使得无损下线成为应用生命周期中必不可少的一个环节。
17677 12
Spring boot 2.3优雅下线,距离生产还有多远?
|
5月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
304 1
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!