2013-08-26 14 views
7

サーブレットアプリケーションに適切なシャットダウンメカニズムを実装する必要があります。長いシャットダウン中にサーブレットリクエストを処理する方法

EDIT:できるだけシンプルにしたい。オペレーティングシステムの機能によって送信されるkillシグナルを処理することが望ましい。これにより、システム管理者はシェルユーティリティ(Windowsではkillまたはtaskkill)を使うことができます。そうしないと、サーバと "話す"ために別のユーティリティをインストールする必要があります。

このメカニズムは、2つのフェーズで動作します:

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

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

私たちの問題は、contextDestroyedが呼び出されると、サーブレットコンテナがさらにHTTPリクエストの処理を停止するということです。

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

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

+0

良い質問です。拒否するアクティビティが特定のサーブレットに実装されている場合、DBルックアップでシャットダウンが進行中であることが示唆された場合、これらの(およびこれらのみ)ステータスを4xxの範囲で返すことができます。 –

+0

いくつかのアクティビティはUIアクションによって開始され、一部はスケジューラによって開始されます。そのため、DAOレイヤでそれらを制御することを考えています。 –

答えて

4

すべての重要なリクエストのリストを保持するには、filterを使用します。

「シャットダウンの準備」要求が受信されると、フィルタはいくつかの要求を拒否し始めます。

キューに残っているクリティカルジョブの数を示すサーブレットを作成します。

シャットダウンツールでは、「シャットダウンの準備」を送信します。重要なジョブの数をサーブレットにポーリングする。これが0になると、実際のシャットダウンコマンドを送信します。

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

サービスは、シャットダウンの進行状況、まだ実行中のクリティカルジョブの数などを関係者に知らせることができます。サーブレットとフィルタは、このサービスを使用して、要求を拒否したり、

すべてのジョブが完了したら、「シャットダウン情報」サーブレットへのアクセスを除くすべてのリクエストを拒否します。これにより、アプリケーションが現在終了する準備ができていることがわかります。

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

[編集] OSがアプリケーションをシャットダウンしないようにしたいと思うかもしれません。 しないでください。

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

はい、管理者はそれについて文句を言います。 Unixでは、このツールをinitスクリプトに入れることでこのツールを隠すことができるので、誰も気づかないでしょう。 Windowsにも同様のソリューションが存在する可能性があります。

シャットダウンコードのバグ、停電時の緊急シャットダウン、アプリケーションコードのバグ、またはMurphyの発生時など、予期しない状況が発生した場合、サーバを強制終了することは常に可能です。

+0

一部のアクティビティはUIアクションによって開始され、一部はスケジューラによって開始されます。フィルタは、スケジューラによって開始されたアクションでは機能しません。 –

+0

フィルタは、リスト/キューをグローバルな場所(静的変数またはアプリケーションスコープ内のエントリ)に保持する必要があります。これにより、スケジューラーがそれを見ることができるように実装することが可能になります。その他すべてが失敗した場合は、DIフレームワークを使用します。 –

+0

これは、ビジネスロジックレイヤーがプレゼンテーションレイヤーを「知っている」ようにするでしょうか? –

関連する問題