私は、JavaアプリケーションをUbuntu 16.04 LTS上で実行しています。エンドポイントの呼び出し時にシャットダウンスレッドが消える
アプリケーションがシャットダウン信号を受信した場合、シャットダウンシーケンスがこのように実行されます。
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
shutdown();
}
});
これは、すぐに私は(私が受信して改修を使用していた外部RESTエンドポイントを呼び出そうとして正常に動作しますが、 Observables)、スレッドはそこで完全に消滅し、エンドポイントは呼び出されず、連続したコマンドはもはや実行されません。
- 私は最初Observablesが問題になると考えて、Retrofit
Call
を代わりに使用しました。同じ問題。 - その後、非同期エンドポイントを呼び出す代わりに、同期呼び出しを試みました。同じ問題。
- シャットダウンの時間は問題ではありません。私は明示的に30秒を与えた。
これはスレッディングと関連があると想定します。ライブラリがシャットダウン中に余分なスレッドを作成すると、JVMはすべてを殺すようです。
誰かが光を当てたり、私が試してみることができる他のものを提案することができます。
-
追加情報:
私は長時間実行クリーンアップを実行する必要があります。問題は、シャットダウン信号がどのように見えるか、それが起こったときには判断できません。ホストが停止しているときに、docker stop
のDockerコンテナで実行され、最初にSIGTERM
を送信してから、 、現在60秒)SIGKILL
。コンテナ内のJVMは、潜在的に何千ものクライアントに接続できるsocket.ioを実行します。私は各クライアントにgood-bye
を送り、これらをきれいに切断し、ロードバランサからサーバを登録解除するのに60秒を使いたいと思う。そのため、クリーンアップ中にブロックする可能性のある操作がたくさんあります。
Javaはクリーンアップが常に不足していると信じている場合は、Javaが間違っている:(
シャットダウンフックはできるだけ早く終了し、確実にネットワーク操作を行わないでください。 Javadocを参照してください。 – EJP