は、私が作成したJava ExecutorService
で構成されますSpring管理Beanの使用コマンドラインアプリケーションがあります。今SpringでExecutorサービスを正しくシャットダウンする方法は?
ExecutorService service = Executors.newFixedThreadPool(4);
を、私のアプリケーションがシャットダウンしたとき、私はシャットダウンに私のサービスをしたいので、私は私の豆を作りましたDisposableBean
インタフェースを実装し、そのように破壊する方法があります。そして、私は春のコンテキストにシャットダウンフックを登録するような何かをしたくなるかもしれません
public void destroy(){
service.shutdown();
}
。しかし、私はこれがうまくいかないことを知りました。シャットダウンフックは、ExecutorService.shutdown()
メソッドが呼び出される前に呼び出されないため、古典的なキャッチ22の問題が発生します。アプリケーションが実行されている間にCtrl-Cを押した場合など)。何らかの理由でJUnitの中から何らかの理由で正常に動作しているように見えるので、これは私の単体テストを免れました.JUnitはまだ私を困惑させています。
私が今までに見つけた解決策は、メイン機能を終了する直前にApplicationContext.close()
を明示的に呼び出すことでした。私は、これにはより良い解決策があるのか、Springによって管理される柔軟なスレッドプールを持つためのベストプラクティスがあるのだろうかと思いました。また、私のbeanがでない場合は、はSpringによって直接管理されますが、Springによって管理されるBeanによって作成されますか?私はちょうどdestroy()
へのコールをカスケードする必要がありますか?これは非常にエラーが発生しやすいでしょうか?
コメント、提案、さらに読む、RTFM、魔法のレシピをありがとう。
ありがとうございます!
ExecutorService service = Executors.newFixedThreadPool(4);
これに置き換えることができます: - そしてそれができる
<bean id="service" class="java.util.concurrent.Executors"
factory-method="newFixedThreadPool" destroy-method="shutdown">
<constructor-arg value="4"/>
</bean>
春のコンテキストは、その後、より直接的に、あなたのエグゼキュータのサービスのシャットダウンを管理
PS:コマンドラインアプリケーションをTomcatなどのアプリケーションサーバーに移動する場合はどうすればよいですか?何か変わるでしょうか? –
タイトルとあなたのPSを含めて、私は7 *(7!)の疑問符を数えます。 :-)あなたが特定の質問を1つだけ聞くと、より良い回答が得られるかもしれません。 – Keith