私は現在、多くの異なるタスクを実行するデーモンに取り組んでいます。マルチスレッドであり、クラッシュすることなく、ほぼすべての種類の内部エラーを処理するように構築されています。さて、シャットダウン要求を処理するところまで来ましたが、どうすればよいかわかりません。
私はシャットダウンフックをセットアップしており、それが呼び出されると、メインデーモンループに実行を停止するように指示する変数を設定します。問題は、このデーモンが複数のスレッドを生成し、長い時間がかかることです。たとえば、これらのスレッドの 1 つがドキュメントを変換している可能性があります。それらのほとんどは高速ですが (10 秒未満だと思います)、10 分以上続くスレッドもあります。
私が今考えているのは、シャットダウン フックが送信されたとき、500 ミリ秒 (またはそれくらい) のスリープ (これらのスレッドはすべて ThreadGroup 内にあります) で ThreadGroup.activeCount() で 5 秒ほどループを実行することです。このループで、シャットダウン要求が呼び出されたことを知らせる通知をすべてのスレッドに送信します。次に、クリーンアップとシャットダウンを行っていることに関係なく、即座に実行する必要があります。
他に何か提案はありますか?たとえばMySQLのようなデーモンが停止するように言われたときに何をするかに興味があります。それは即座に停止します。非常に遅い 10 個のクエリが呼び出されている場合はどうなりますか? それは待つか、それとも単にそれらを終了しますか。つまり、サーバーは非常に高速なので、1 秒以内に実行できない操作はありません。現在、1000ミリ秒で多くのことができます。
ありがとう