2009-09-16 16 views
9

Tomcatでは、起動時にExecutorServiceを開始し、アンロード時に終了させるServletContextListenerを作成しました。ExecutorServiceのシャットダウン

私は私の質問は、私はcontextDestroyed()メソッドで例外:InterruptedExceptionを伝播する必要がありますされExecutorService

public void contextDestroyed(ServletContextEvent sce) 
{ 
    executor.shutdown(); 
    try 
    { 
     executor.awaitTermination(50, TimeUnit.SECONDS); 
    } 
    catch(InterruptedException ie) 
    { 
     Thread.currentThread().interrupt(); 
    } 
} 

ためjavadocの例を、以下のでしょうか?

+1

エグゼキュータは閉鎖されていますか?私はこの同じコードを使用していませんでした...(さらに多くのアプローチ) – SoulWanderer

+0

鉱山は同じコードで閉じることもありません。私はtomcat 7を使用します – lili

答えて

4

私は「いいえ」と言います。 contextDestroyedメソッドは、コンテクストが解約しようとしているという通知としてコンテナから呼び出されます。これはあなたの許可を求めるものではありません。また、Javadocは、例外をスローすると何が起こるかを定義していないため、結果は予測不可能である可能性があります。

キャッチブロック内にexecutor.shutdownNow()と呼んで強制的にエグゼキュータを終了します(つまり、あなたはチャンスがあった、今停止します)。

+0

"予測できない"場合、例外がスローされた場合に起こりうる最悪の事は何ですか? –

+0

shutDownNow()推奨でスポットライトを+1します。例外を取り除き、ここにフラグを設定するのは本当に正しいことです。 –

+0

最悪の場合、そのコールバックを実行するコードはそれを捕まえず、スレッドがクラッシュします。 さらに重要なことに、 "awaitTermination()"からの例外が何を示しているかについて考えてください。すべての例外手段は、スレッドが終了する必要があることを示す別のスレッドによって中断されたため、スレッドがすべてのスレッドの終了を待つことができないことです。ブロッキングコールをしていない場合は、割り込みフラグがバックグラウンドで設定されていて、それについて知ることさえできません。だからここに正しいのは、フラグをセットし、エグゼキュータを終了してフラグをセットすることです。 –

1

あなたのコードサンプル(現在のスレッドを再割り込み)にあるものは、私がお勧めするものです。独自のコードの外にあるTomcatの何かが元の割り込みを送信したので、Tomcatがそれを処理する機会を与えます。

私はTomcatがInterruptedExceptionで何をするのか分かりません。それは未定義です。しかし、Tomcatはinterruptを開始し、TomcatはcontextDestroyed(...)メソッドが実行しているスレッドを所有しています。ここで適用される "Java Concurrency in Practice"の一般的な原則は、スレッドの作成者が、サイシス問題。

割り込みの処理は、ライフサイクルの問題であることは間違いありません。

+0

TomcatがInterruptedExceptionで何をするのか知っていますか? –

0

私はSteveに同意します。割り込みフラグをリセットすると、コントロール外のコードがイベントに反応する可能性があります。

tempus-fugitは、これを行うためのconvieanceメソッドを提供します。また、時間がかかりすぎると、explict timeout例外が発生します。

waitOrTimeout(shutdown(executor), timeout); 

もしその関心のドキュメントの同時実行セクションの下で見てください... tempusfugitlibrary.org/documentation

このexampleは完了し、より積極的なシャットダウンを待っているため、両方の、その使用方法を示しています。

関連する問題