分类: Java
2021-06-10 08:27:45
先来一段简单的代码,如下:
当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (kill),spring boot 默认情况会直接关闭容器(tomcat 等),导致此业务逻辑执行失败。在一些业务场景下:会出现数据不一致的情况,事务逻辑不会回滚。
在最新的 spring boot 2.3 版本,内置此功能,不需要再自行扩展容器线程池来处理, 目前 spring boot 嵌入式支持的 web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。 我们来看下如何使用:
当使用 server.shutdown=graceful启用时,在 web 容器关闭时,web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。
此处支持的 shutdown 行为,我们看下 源码枚举如下:
缓冲期 timeout-per-shutdown-phase 配置
效果体验
执行关闭应用
- 关于此处执行 kill -2 而不是 kill -9
- 通过 actuate 端点实现优雅停机
POST 请求 /actuator/shutdown 即可执行优雅关机。
源码解析
- 不同 web 容器优雅停机行为区别
容器停机行为取决于具体的 web 容器行为
web 容器名称 | 行为说明 |
---|---|
tomcat 9.0.33+ | 停止接收请求,客户端新请求等待超时。 |
Reactor Netty | 停止接收请求,客户端新请求等待超时。 |
Undertow |
停止接收请求,客户端新请求直接返回 503。 |