Graceful Shutdown
默认情况下,所有四种嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及响应式和基于 Servlet 的 Web 应用程序都启用了优雅关闭(Graceful shutdown)。它作为关闭应用上下文的一部分,在停止 SmartLifecycle Bean 的最早阶段执行。此停止处理使用一个超时时间,该超时提供了一个宽限期,在此期间允许现有请求完成,但不允许新的请求进入。
要配置超时时间,请配置 spring.lifecycle.timeout-per-shutdown-phase 属性,如下例所示:
- Properties
- YAML
spring.lifecycle.timeout-per-shutdown-phase=20s
spring:
lifecycle:
timeout-per-shutdown-phase: "20s"
如果你的 IDE 没有发送正确的 SIGTERM 信号,其关闭操作可能是立即终止而非优雅关闭。更多详情请参阅你所使用 IDE 的文档。
在优雅停机宽限期内拒绝请求
新请求被拒绝的具体方式取决于所使用的 Web 服务器。实现方式可能是在网络层停止接受请求,也可能返回一个带有特定 HTTP 状态码或 HTTP 头的响应。持久连接的使用也会影响请求停止被接受的方式。
要了解与您的 Web 服务器一起使用的具体方法,请参阅 shutDownGracefully API 文档:TomcatWebServer.shutDownGracefully(GracefulShutdownCallback)、NettyWebServer.shutDownGracefully(GracefulShutdownCallback)、JettyWebServer.shutDownGracefully(GracefulShutdownCallback) 或 UndertowWebServer.shutDownGracefully(GracefulShutdownCallback)。
Jetty、Reactor Netty 和 Tomcat 将在网络层停止接受新请求。Undertow 会接受新连接,但会立即返回服务不可用(503)响应。
禁用优雅关闭
要禁用优雅关闭,请配置 server.shutdown 属性,如下例所示:
- Properties
- YAML
server.shutdown=immediate
server:
shutdown: "immediate"