Tomcatで動作するマルチスレッドWebアプリケーションを開発しました。 しかし、私は正常に停止しませんでしたスレッドはTomcatによって正常にシャットダウンするように特別な設計をしていますか?
shutdown.bat
Tomcatを使用することはできません。デバッガでは、シャットダウンコマンドの後にスレッドが実行され続けることがわかりました。特別な要件を満たすためにアプリケーションコードを修正する必要がありますか?おかげさまで
Tomcatで動作するマルチスレッドWebアプリケーションを開発しました。 しかし、私は正常に停止しませんでしたスレッドはTomcatによって正常にシャットダウンするように特別な設計をしていますか?
shutdown.bat
Tomcatを使用することはできません。デバッガでは、シャットダウンコマンドの後にスレッドが実行され続けることがわかりました。特別な要件を満たすためにアプリケーションコードを修正する必要がありますか?おかげさまで
... Javaサーブレット環境の動作に対する他の応答を結び付けるために、
スレッドをデーモンスレッドとして宣言していない場合、サーバーシャットダウンをスレッドに通知する方法は、ServletContextListener
を実装し、それをWebアプリケーション(web.xml)に設定することです。 Tomcatがシャットダウンすると、最初に各アプリケーションがシャットダウンされ、リスナーのメソッドcontextDestroyed()
が呼び出されます。これは自分のスレッドに自分の作業を完了させるように通知することができます。
まだ実行されているスレッドは、Java(Tomcat)プロセスを有効にします。すべてのスレッドが終了していることを確認してください。スレッドが終了すると、Tomcatはシャットダウンできます。
Threadのjavadocを参照してください。次の点に注意してください
Java仮想マシンは、以下のいずれかが発生するまでスレッドを実行し続けます。
- Runtimeクラスのexitメソッドが呼び出され、セキュリティマネージャがに終了操作を許可しています起こる。
- 呼び出しからrunメソッドに戻り、runメソッドを超えて伝播する例外をスローすることによって、デーモンスレッドではないすべてのスレッドが終了しました。
これらのスレッドについての確認ツールはありますか? – Azim
あなたは、好ましくは、それらの上にinterrupt
を呼び出し、彼らが中断に反応するように書かれていることを確認することによって、あなたのスレッドをキャンセルする必要がある - 意味、彼らの中断フラグをチェックし、InterruptedExceptionsにインテリジェントに応答(それらを食べるだけではなく)。
上記のアドバイスは、スレッドが直ちに行っていることをドロップしたくないと仮定しています。あなたがそれで大丈夫なら、それらをデーモンにしてください。
独自のスレッドを作成する3番目の部分ライブラリを使用する問題。そして、これらのスレッドで問題があります。 – user710818
@ user710818:はい、それは悪い問題です。私は図書館があなたに優雅なシャットダウンをするように指示する何らかの方法を提供してくれることを願っています。 –
この問題を引き起こしているスレッドを見つけ出すには、この問題を抱えているので、私にとっては役に立ちます。 – Azim
kill -3、jstack、またはtomcatを使用すると、catalina.outのスタックトレースをダンプすることがよくあります。 – ticktock