9

サーブレット アプリケーションにグレースフル シャットダウン メカニズムを実装する必要があります。

編集: オペレーティング システムの機能を介して送信されたキル シグナルを処理する、できるだけ単純にしたいと考えています。これにより、システム管理者は組み込みのシェル ユーティリティ (Windows では kill または taskkill) を使用できるようになります。それ以外の場合は、サーバーと「対話」するためだけに別のユーティリティをインストールする必要があります。

このメカニズムは、次の 2 つのフェーズで機能します。

  1. シャットダウン要求に応じて、特定の重要なアクティビティを拒否します
  2. 以前に開始された重要なアクションが完了するまでブロックします。これらには数時間かかる場合があります

フェーズ 1 は、DAO レイヤーに実装されます。フェーズ 2 は、ServletContextListener#contextDestroyed メソッドに実装されています。

問題は、contextDestroyed が呼び出されると、サーブレット コンテナがそれ以降の HTTP リクエストの処理を停止することです。

編集: contextDestroyed は、誰かがサーバーのプロセスでオペレーティング システムの kill 関数を呼び出しているときに呼び出されます。

フェーズ 2 でアプリケーションを有効にして、一部のアクティビティが利用できないことをユーザーに通知します。

4

1 に答える 1

5

フィルタを使用して、すべての重要なリクエストのリストを保持します。

「シャットダウンの準備」リクエストを受信すると、フィルターは一部のリクエストの拒否を開始する必要があります。

キューに残っている重要なジョブの数を通知するサーブレットを作成します。

シャットダウン ツールで、「prepare shutdown」を送信します。重要なジョブの数についてサーブレットをポーリングします。これが 0 になったら、実際のシャットダウン コマンドを送信します。

これを実現するには、これを調整するビジネス レイヤーでサービスを作成します。が呼び出される前に すべてが発生する必要があることに注意してください。contextDestroyed()特別なアプリケーションのシャットダウンは、J2EE の世界観に合わないため、自分で管理する必要があります。

このサービスは、シャットダウンがいつ進行中であるか、まだ実行中の重要なジョブの数などを関係者に通知できる必要があります。サーブレットとフィルターは、このサービスを使用してリクエストを拒否したり、残っているジョブの数を通知したりできます。

すべてのジョブが完了したら、「シャットダウン情報」サーブレットへのアクセス以外のすべてのリクエストを拒否します。サーブレットは、アプリが終了する準備ができていることを通知します。

アプリのシャットダウンを開始するための優れた UI を管理者に提供するツールを作成します。

[編集] OS がアプリケーションをシャットダウンするのを防ぎたくなるかもしれません。そうしないでください。

あなたがすべきことは、上で説明した 2 段階のプロセスを使用して、アプリケーションをシャットダウンするための特別なツールを作成することです。これは、シャットダウンする標準的な方法です。

はい、管理者はそれについて文句を言うでしょう。Unix では、このツールを init スクリプトに入れることで非表示にできるため、誰も気付かないでしょう。Windows でも同様の解決策があるかもしれません。

シャットダウン コードのバグ、電源障害時の緊急シャットダウン、アプリケーション コードのバグ、またはマーフィーが発生した場合などの (予期しない) 予期しない状況の場合にサーバーを停止できるように、サーバーの強制終了は常に可能である必要があります。

于 2013-08-26T13:29:04.787 に答える