📢 大家好,我是 【战神刘玉栋】,有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 {@PreDestroypublic 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> {@Overridepublic 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
项目中如何进行优雅停机的相关知识,仅供学习参考。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。