アプリケーションに、監視アプリケーションに 5 分ごとにハートビートを送信するスレッドが永続的に実行されています。
アプリケーションが例外ブロックで失敗した場合、それを実行しているスレッドを終了する必要があります (while ループは、中断されていないスレッドに基づいています)。
これは、すべてのキャッチで、システム終了またはそのスレッドを中断するための呼び出しが必要になることを意味しますか? これは非常に厄介なアプローチのようですが、他の方法もわかりません。
ありがとう
アプリケーションに、監視アプリケーションに 5 分ごとにハートビートを送信するスレッドが永続的に実行されています。
アプリケーションが例外ブロックで失敗した場合、それを実行しているスレッドを終了する必要があります (while ループは、中断されていないスレッドに基づいています)。
これは、すべてのキャッチで、システム終了またはそのスレッドを中断するための呼び出しが必要になることを意味しますか? これは非常に厄介なアプローチのようですが、他の方法もわかりません。
ありがとう
このスレッドをデーモン スレッドとして指定できます。申し込みをもって終了となります。
メイン アプリケーションとスレッドの両方で読み取り可能なオブジェクトを使用することを検討してください。メイン アプリケーションで例外が発生した場合、finally
アプリケーションがシャットダウンしているか、シャットダウン中であることをハートビート スレッドに通知するオブジェクトを設定するブロックが必要です。
これにより、ハートビートが最後の「デッド」メッセージを送信するメカニズムが得られる場合があります。これにより、単にハートビートを送信しないのではなく、アプリケーションが停止したことをモニターに伝え、理由を一覧表示できます。
理想的には、アプリケーションからスレッドにメッセージを送信して終了する方法が必要です。
これは、while ループの基になっている式によって異なります。現在、コードのタイプが次の場合:
while(expression)
式がブール値を返す場合、いつでも次のように置き換えることができます。
while(Thread.currentThread.interrupted()){
if(!expression)
break;
//....
}
これは完璧なソリューションです。または、ブール値を使用して通知することもできます。または、おそらくwhile
キューに基づいている場合は、POISON_PILL を追加します。これは、ループから抜け出す時が来たことを表します。
Daemon thread
上記のソリューションでもありますが、データを保存するか、リソースを閉じたり管理したりするかによって異なります。それなら問題だろう。
最終的に堅牢性を確保するには、適切なシャットダウン ポリシーを作成する必要があります。