グレースフルシャットダウン

正常なシャットダウンは、4 つの組み込み Web サーバー (Jetty、Reactor、Netty、Tomcat、Undertow) すべてと、リアクティブ Web アプリケーションおよびサーブレットベースの Web アプリケーションの両方でサポートされています。これは、アプリケーションコンテキストを閉じる際に発生し、SmartLifecycle Bean を停止する最も早い段階で実行されます。この停止処理では、タイムアウトが使用されます。タイムアウトによって猶予期間が与えられ、その間は既存のリクエストは完了できますが、新しいリクエストは許可されません。

新しいリクエストが許可されない具体的な方法は、使用されている Web サーバーによって異なります。実装によっては、ネットワーク層でリクエストの受け入れを停止したり、特定の HTTP ステータスコードまたは HTTP ヘッダーを含むレスポンスを返すことがあります。永続的な接続を使用すると、リクエストの受け入れを停止する方法が変わることもあります。

Web サーバーで使用される特定のメソッドの詳細については、TomcatWebServer (Javadoc) NettyWebServer (Javadoc) JettyWebServer (Javadoc) または UndertowWebServer (Javadoc) の shutDownGracefully javadoc を参照してください。

Jetty、Reactor、Netty、Tomcat は、ネットワーク層で新しいリクエストの受け入れを停止します。Undertow は新しい接続を受け入れますが、すぐにサービス利用不可 (503) レスポンスでレスポンスします。

Tomcat による正常なシャットダウンには、Tomcat 9.0.33 以降が必要です。

グレースフルシャットダウンを有効にするには、次の例に示すように、server.shutdown プロパティを構成します。

  • プロパティ

  • YAML

server.shutdown=graceful
server:
  shutdown: "graceful"

タイムアウト期間を構成するには、次の例に示すように、spring.lifecycle.timeout-per-shutdown-phase プロパティを構成します。

  • プロパティ

  • YAML

spring.lifecycle.timeout-per-shutdown-phase=20s
spring:
  lifecycle:
    timeout-per-shutdown-phase: "20s"
IDE が適切な SIGTERM 信号を送信しない場合、IDE でグレースフルシャットダウンを使用すると正しく機能しない可能性があります。詳細については、IDE のドキュメントを参照してください。