📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍
文章目录
- 优雅停机
- 技术简介
- 实现步骤
- 自定义方式
 
- 总结陈词
 

优雅停机
技术简介
在 Spring Boot 中,“优雅停机”(Graceful Shutdown)指的是在应用程序关闭时,能够优雅地处理正在进行的请求和任务,而不是强制立即终止。这种机制可以确保在应用程序关闭时,现有的请求能够被处理完毕,避免数据丢失或请求失败。
优雅停机的特点
- 处理现有请求:在接收到关闭信号后,应用会停止接收新的请求,但会继续处理已经接收到的请求。
- 可配置的超时:可以配置一个超时时间,在这个时间内,应用会尝试完成所有正在进行的请求。如果超时后仍有请求未完成,应用会强制关闭。
- 资源清理:在关闭过程中,可以执行一些清理操作,比如关闭数据库连接、释放资源等。
支持的版本
 优雅停机功能在 Spring Boot 2.3 中首次引入,并在后续版本中得到了增强和改进。Spring Boot 3 继续支持和优化这一特性。
实现步骤
Step1、添加依赖:首先确保你的Spring Boot项目中包含了Spring Boot Actuator的依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Step2、启用端点:默认情况下,ShutdownEndpoint是禁用的。你需要在application.properties或application.yml文件中启用它。
# 很多资料仅配置shutdown,会提示 No static resource actuator/shutdown
management:
  endpoints:
    # 暴露所有端点信息,设置为false比较安全,端点需要的单独打开
    enabled-by-default: true
    #以web方式暴露
    web:
      exposure:
        include: '*'
Step3、使用端点:一旦启用了 ShutdownEndpoint,你可以通过HTTP请求来触发应用程序的关闭。
# 使用curl命令,这会导致应用程序开始关闭过程。
curl -X POST http://localhost:8082/actuator/shutdown
会输出如下信息:
{
    "message": "Shutting down, bye..."
}
温馨提示:基于安全考虑,由于这个端点会关闭应用程序,所以通常只应该在受保护的环境中使用,例如通过安全框架如Spring Security 限制访问。
自定义方式
您可以通过以下几种方式实现优雅关机时的自定义逻辑:
 1、使用 @PreDestroy 注解
 在 Spring 管理的 bean 中使用 @PreDestroy 注解,可以在 bean 被销毁之前执行一些清理逻辑。
@Component
public class MyService {
    @PreDestroy
    public void cleanup() {
        System.out.println("Cleaning up resources...");
    }
}
2、实现 ApplicationListener 接口
 您可以实现 ApplicationListener 接口,以便在应用程序上下文关闭时执行特定操作。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;
@Component
public class MyContextClosedListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 执行清理操作
        System.out.println("Application context is closing...");
    }
}
3、使用 SpringApplication 的 addListeners 方法
 在启动应用程序时,您可以向 SpringApplication 添加自定义监听器,以便在应用程序关闭时执行特定操作。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.addListeners((ApplicationListener<ContextClosedEvent>) event -> {
            System.out.println("Application is shutting down...");
        });
        app.run(args);
    }
}
4、自定义类继承ShutdownEndpoint,具体方法后续展开。
总结陈词
此篇文章介绍了SpringBoot 项目中如何进行优雅停机的相关知识,仅供学习参考。
 💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。




















