24時間年中無休で実行されているJavaアプリケーションはほとんどありません。このアプリケーションのいずれかがクラッシュするかどうかをチェックする別のJavaアプリケーションを作成したいと思います。一部のアプリケーションがクラッシュした場合は、再起動したいと思います。これに対する解決策はありますか?
5 に答える
いくつかの方法がありますが、それを行うためのより良い方法があるはずです:
実行中のアプリケーションを制御できる場合は、各アプリケーションがマシン上の特定のポートをリッスンし、要求に応答するようにすることができます。次に、そのポートに ping を実行するだけで、アプリが実行されているかどうかを確認できます。
自分でアプリを起動すると、その pid を保存して、その pid を持つプロセスがまだ生きているかどうかを確認できます。
各アプリはファイルを作成し、定期的に更新できます。その後、監視アプリはファイルが更新されているかどうかを確認できます。そうでない場合、アプリは死んでいます。
wmic ユーティリティを使用できます。このような :Process proc = Runtime.getRuntime().exec("wmic.exe");
次に、Java アプリ (javaw.exe) アプリケーションに関連付けられているさまざまなパラメーターを確認できます。
おそらく ( http://quartz-scheduler.org/ ) Quartz スケジューラー、または java.util.Timer API を使用して recurrently.and プロセスをチェックすることができます。プロセスを実行するたびに、保存できるPIDまたはプロセスIDを取得できると思います。定期的に起動し、シェル sript を呼び出して、プロセスが実行されているかどうかを確認します。そうでない場合は、Runtime.getRuntime() を使用して新しいプロセスを生成します
シンプルなソリューションを使用できる場合、アプリケーションは、アプリケーションのコア機能内から外部リソースを更新する必要があります。外部リソースがしばらく更新されない場合、アプリケーションのコアが停止したことがわかります。
別のスレッドを使用してリソースを更新すると、コア機能がクラッシュしますが、スレッドは実行され続け、何も検出されません。
外部リソースはファイルにすることができます。そこに現在のタイムスタンプを書きます。タイムスタンプがしばらく更新されない場合、アプリがクラッシュしています。または、モニターがハードウェアのクラッシュを検出するために別のマシン上にある場合は、ネットワーク ソケットに書き込みます (モニターがアプリケーションでクラッシュした場合、モニターはほとんど役に立ちません)。
モニターは、必要に応じて Java プロセスを強制終了して再起動できるように、Java プロセスのプロセス ID を認識している必要があります。シェル スクリプトからアプリを起動すると、プロセス識別子をファイルに書き込むことができます。
この種のソフトウェア モニターを製造する 10 億ドル規模の産業が存在します。これは簡単な作業ではありません。
私が考えることができるのは、24時間年中無休で実行されているプログラムで新しいカスタム例外を定義し、その例外をクラッシュが発生すると思われるブロックに追加し、クラッシュによってこの例外が呼び出されたときに別のJavaアプリケーションのメソッドを呼び出すことができるということです.