0

このようなShutdownHookを使用するコードを見ました

Runtime.getRuntime().addShutdownHook(new Thread(){
    ConfigurableApplicationContext.stop();
    //close spring context;
    threadpool.shutdownnow();
    //close theadpool
});

このようにするのに役立つことはありますか?

私は思った

jvm が終了すると、おそらくスレッドはすぐにシャットダウンされ、スプリング コンテキストも閉じられます。</p>

System.exit() を呼び出す必要がある場合、次に何をすればよいでしょうか?

4

1 に答える 1

0

それは実際には、アプリケーションとオブジェクトのライフサイクルと、コンテキスト外にあると思われるスレッドに依存します。スタンドアロンの Java プロセス内で Spring コンテナーを実行している場合、このようにシャットダウン フックをトラップすることが 1 つの方法です。もう 1 つの方法は、tcp ポートでリッスンし、コマンドを送信してシャットダウン プロセスを開始することです。Tomcat のような Web コンテナーで実行している場合は、Spring が Context Listener でサポートする通常の webapp シャットダウンの標準に従う必要があります。

また、Spring コンテナー内に存在する Bean でスレッドがすべて管理されるように、アプリを再設計することも検討します。たとえば、開始/停止メソッドのディレクティブ (属性) で構成された Bean を使用すると、その Bean はスレッド プーリングに Executor を使用します。このように、シャットダウンは Spring コンテナーのみをシャットダウンし、Spring は Bean の整然としたシャットダウンを非常に適切にサポートします。それらの Bean の 1 つは、Executor 内のスレッドを保持するオブジェクトです。Spring Bean を外部スレッドと統合しようとするよりも、はるかにクリーンな方法です。

お役に立てれば。

于 2013-10-26T02:45:02.820 に答える