《学会 SpringBoot · 优雅停机方案》

devtools/2024/11/15 0:48:58/

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 优雅停机
      • 技术简介
      • 实现步骤
      • 自定义方式
    • 总结陈词

CSDN.gif


优雅停机

技术简介

在 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 被销毁之前执行一些清理逻辑。

java">@Component
public class MyService {@PreDestroypublic void cleanup() {System.out.println("Cleaning up resources...");}
}

2、实现 ApplicationListener 接口
您可以实现 ApplicationListener 接口,以便在应用程序上下文关闭时执行特定操作。

java">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 添加自定义监听器,以便在应用程序关闭时执行特定操作。

java">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 项目中如何进行优雅停机的相关知识,仅供学习参考。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif


http://www.ppmy.cn/devtools/96376.html

相关文章

肿瘤细胞表皮生长因子EGFR靶向肽;GE11;YHWYGYTPQNVI

【GE11简介】 GE11肽是从噬菌体展示肽库中筛选出来的一种有效的EGFR配体&#xff0c;它是一种十二肽&#xff0c;可以高亲和力和选择性地与EGFR特异性结合。GE11已广泛用于EGFR阳性肿瘤的放射治疗、基因治疗和化疗药物的诊断和靶向递送。 【中文名称】肿瘤细胞表皮生长因子肽…

C:每日一练:单身狗(2.0版本)

前言&#xff1a; 今天在刷题的时候突然看到一道题&#xff0c;疑似一位故题。仔细一看&#xff0c;欸&#xff01;这不是就是单身狗的升级版吗&#xff1f;我想那必须再安排一篇&#xff0c;不过由于本篇文章与上一篇单身狗文章所涉及的知识点基本相同&#xff0c;所以还请大…

【SpringBoot】SpringBoot框架的整体环境搭建和使用(整合Mybatis,Druid,Junit4,PageHelper,logback等)

目录 1.介绍 1.1 配置文件 1.2 目录结构 2.基于SpringBoot的SpringMVC 4.整合Mybatis 5.整合Druid连接池 6.整合Junit4 7.整合Logback 8.整合PageHelper 9.SpringBoot整合Thymeleaf ​编辑 【附录】springboot的pom.xml 1.介绍 Spring框架的优点是方便解耦、简化开…

Spring IoCDI(中)--IoC的进步

通过上文的讲解和学习, 我们已经知道了Spring IoC 和DI的基本操作, 接下来我们来系统的学习Spring IoC和DI 的操作. 前⾯我们提到IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对 象&#xff0c;也就是bean的存储。 1. Bean的…

【python小脚本】摄像头rtsp流转hls m3u8 格式web端播放

写在前面 工作需要&#xff0c;简单整理实际上这种方式延迟太高了&#xff0c;后来前端直接接的海康的本地解码插件&#xff0c;走的 websockt博文内容为 摄像头 rtsp 实时流转 hls m3u8 的一个 Python 脚本理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚…

如果从mysql导出百万数据级的excel

如果从mysql导出百万数据级的excel&#xff0c;可能遇到的问题&#xff1f; 同步导数据&#xff0c;接口很容易超时。 如果把所有数据一次性装载到内存&#xff0c;很容易引起OOM。 数据量太大sql语句慢。 如果走异步&#xff0c;如何通知用户导出结果 如果excel文件太大&#…

XSS--DOM破坏案例与靶场

靶场连接https://xss.pwnfunction.com/challenges/ 目录 Ma SPaghet! Jeff Ugandan Knuckles Ricardo Milos Ah Thats Hawt Ligma Mafia Ok,Boomer Ma SPaghet! <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHT…

wpf IDataErrorInfo 验证

我可以给你一个简单的例子来说明如何在WPF中使用IDataErrorInfo接口来显示错误信息&#xff0c;并通过样式&#xff08;Style&#xff09;和触发器&#xff08;Trigger&#xff09;来在UI上反映这些错误。 首先&#xff0c;你需要一个实现了IDataErrorInfo接口的模型类。这个接…