实际工作中,我们在重启项目时肯定是希望目前的请求能处理完,要不然可能会出现很多数据问题要处理。这个时候就需要能够优雅的关闭项目了。
何为优雅的关闭项目
优雅的关闭项目就是说,在应用关闭的过程中,会首先停止接收新的请求,然后等待当前正在处理的活动请求完成。这提供了一个缓冲期,确保在应用关闭之前,所有已经开始的请求都能够得到妥善处理,避免了因为突然关闭而导致的请求中断或数据丢失等问题。
在Springboot中要怎么做
从SpringBoot 2.3.0开始提供了优雅关闭功能,支持四种嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于Servlet的Web应用程序都可以使用这个功能。优雅关闭对Tomcat版本也有要求,需要是 Tomcat 9.0.33 或更高版本。
优雅关闭使用起来也非常简单,只需要下面2个配置:
-
server.shutdown:配置应用的关闭方式,它有2个选择graceful和immediate,默认值是immediate。immediate:当设置为immediate时,服务器会立即停止接受新的连接,并尝试立即关闭所有现有的连接。这可能会导致正在处理的请求被中断,数据可能无法完全写入或读取。graceful:当设置为graceful时,服务器会停止接受新的连接,但会等待现有的连接和请求完成处理。这意味着,即使关闭命令已经发出,任何已经接收到的请求都会得到完整的处理,从而避免了数据丢失或请求中断的情况。
-
spring.lifecycle.timeout-per-shutdown-phase=30s:配置在SpringBoot项目中用于设置优雅关闭过程中每个关闭阶段的超时时间,默认是30s。当应用程序关闭时,SpringBoot会执行一系列的关闭操作,包括释放资源、清理数据等。这个属性设置了每个关闭阶段的最长等待时间,如果某个阶段在规定的时间内无法完成,Spring 会强制终止这个关闭阶段,以确保应用程序能够尽快退出。
server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=30s
配置了优雅关闭之后,在关闭项目时会看到如下提示:
注意:如果你的 IDE 未发送正确的 SIGTERM 信号,则使用正常关闭可能无法正常工作。有关更多详细信息,请参阅 IDE 的文档。
SIGTERM 信号的全称是 "Signal Terminate",它是在 Unix 和 类 Unix 操作系统中用于终止进程的信号。 当我们想要关闭一个正在运行的进程时,操作系统通常会发送 SIGTERM 信号给该进程,以便它可以优雅地退出。
至此,优雅的关闭Springboot项目的简单介绍就结束了,想了解更多内容可以去看看源码。