2017-08-15 6 views
4

How to shutdown a Spring Boot Application in a correct way? スプリングブートアクチュエータを使用してサーバーを安全にシャットダウンするには?

現在、3つのクライアントが接続されており、各クライアントが長いジョブを実行しているサーバーがあるとします。私たちは、その後のコマンドを使用して、サーバをシャットダウン:

A)は、サーバーがシャットダウンする前に3つのクライアントが実行されていることのジョブを終了してみましょう:

curl -X POST localhost:port/shutdown 

がいることをしていますか?

B)サーバーが最終的にシャットダウンするような他の接続は許可しないでください。

答えて

4

スプリングブートシャットダウンエンドポイントはorg.springframework.boot.actuate.endpoint.ShutdownEndpointというクラスを呼び出し、ApplicationContextclose()を呼び出します。これは、順番に...

  • はあなたの豆を注文され、慎重にシャットダウンする方法を記述した場合、これはあるべき埋め込まれたサーブレットコンテナ

を停止

  • はビーンファクトリ
  • を閉じ豆を破壊します良い。しかし、そうでない場合、シャットダウン・サイクルのある時点で、「3つのクライアントが実行しているジョブ」が中断される可能性があります。また、シャットダウンを起動してシャットダウンサイクルを開始するまでの間に、小さな時間帯に新しい接続を作成することも可能です。

    Springは、シャットダウンサイクルに参加できるアプリケーションイベントとリスナーフックを提供します。 ContextClosedEventはあなたがデフォルトの動作のキックの前に、独自のシャットダウン動作を実装するためにこれを使用することができるように埋め込まれたコンテナがシャットダウンなどで、前に豆が破壊されて公開されている例:

    public class ShutdownListener implements ApplicationListener<ContextClosedEvent> { 
        @Override 
        public void onApplicationEvent(ContextClosedEvent event) { 
         // 
        } 
    } 
    

    あなたがこのリスナーを実装することができ(あなたがHTTPリクエストを扱っていない場合またはそれと同等のもの)それ

    • は、任意の機内ジョブが続行する前に完了できるように
    • ポーズをHTTP 503との接続要求を拒否するようなシャットダウンサイクルで

    このリスナーは、SpringブートでApplicationListenerを登録するのと同じ方法で登録します。

    SpringApplicatiom app = new SpringApplication(MyApplication.class); 
    app.addListeners(new ShutdownListener()); 
    
  • +0

    「豆を破壊する」とはどういう意味ですか? –

    +1

    @JoseMartinezそれはそれらを閉じたり破棄したりすることを意味します。 Springでは、アプリケーションコンテキストが閉じられたときにあなたに代わって呼び出すことを保証する 'destroy-method'を定義できるので、" destroy "という用語が使用されます。 – glytching

    +0

    プログラムによるすべての接続を拒否する方法は? –

    関連する問題