持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
springboot程序的优雅停止
前文
本文内容主要是关于如何进行springboot项目的优雅关闭相关的知识。其中内容主要是一份知识的整理,难免存在不足之处。
为什么需要进行springboot程序的优雅关闭
在我们程序的执行过程中,一般情况下会有若干线程同时进行工作。而当我们需要程序关闭时,关闭的时刻可能有若干线程实际上正处于执行中的状态,例如查询操作、数据库的写入操作等等。而如果我们直接采用linux系统下的进程关闭命令,kill -9 端口号,将程序运行的进程关闭。那么随着进程的关闭,上述正在执行的线程可能全部都会进行关闭。那么就会出现程序执行到一半的情况。那么由于这种意外中断的出现,则会导致我们的程序中可能产生数据错误以及请求被意外中断的不友好之处。因此,我们需要进行程序的优雅关闭。
如何进行springboot程序的优雅关闭
想要关闭程序的所有线程,我们的思路是首先关闭所有的外部连接,不允许新的连接进入。第二部则是等待程序内所有的连接逻辑执行完毕后,再进行程序的关闭。这里我们也就需要一个标识位来通知程序停止接收连接。低版本我们需要进行jar包的引入,高版本2.3.0以上直接通过yml文件配置即可。
<dependency>
<groupId>com.github.timpeeters</groupId>
<artifactId>spring-boot-graceful-shutdown</artifactId>
<version>*.*.*</version>
</dependency>
# 开启优雅停机,默认值:immediate 为立即关闭
server.shutdown=graceful
# 设置缓冲期,最大等待时间,默认:30秒
spring.lifecycle.timeout-per-shutdown-phase=60s
而于此同时,我们需要执行实现TomcatConnectorCustomizer,ApplicationListener,通过对于其中方法的重写,实现我们的关闭逻辑,包含超时强制关闭等等。
而当我们需要关闭程序时,通过http://127.0.0.1:8000/actuator/shutdown进行程序关闭的发起。
后记
千古兴亡多少事?悠悠。不尽长江滚滚流。