2012-01-31 5 views
1

私はspring beanでthreadpoolexecutorを作成します。したがって、tomcatがシャットダウンされたときにこのexecutorをシャットダウンする必要があります。TomcatがシャットダウンされているときにSpring beanでThreadPoolExecutorをシャットダウンする方法はありますか?

 public class PersistBO implements InitializingBean { 

private ThreadPoolExecutor executer; 

public void shutdownExecutor() { 
    executer.shutdown(); 
} 

@Override 
public void afterPropertiesSet() throws Exception { 
    taskQueue = new LinkedBlockingQueue<Runnable>(queueLength); 
    executer = new ThreadPoolExecutor(minThread, maxThread, threadKeepAliveTime, 
      TimeUnit.SECONDS, taskQueue, new ThreadPoolExecutor.DiscardOldestPolicy()); 
} 

解決策をGoogleで検索して結果を得ました。これは、java.lang.runtimeにshutdownhookを追加することです。しかし、javaドキュメントでは、java.lang.Runtime#shutdownHookは最後の非デーモンスレッドが終了すると呼び出されます。だからデッドロックです。 Spring BeanでExecutorをシャットダウンする方法はありますか?

+0

正しいスレッドファクトリを指定すると、プールにデアモンスレッドを使用することもできます。 –

答えて

3

実行者のライフサイクルは、Tomcat全体ではなくアプリケーションのライフサイクルに依存するはずです。 Tomcatがまだ動作している間にアプリケーションを停止することができます。したがって、Runtime.shutdownHook()は適用されません。

すでに初期化のために春とそのInitializingBeanを使用しているため、アプリケーション・コンテキストが閉じているときにクリーンアップを実行するためにDispasableBeanを使用することができます。

public class PersistBO implements InitializingBean, DisposableBean { 
    public void destroy() { 
     shutdownExecutor(); 
    } 
    ... 
} 
0

あなたは、あなたのアプリケーションがされているときに通知されるように、独自のjavax.servlet.ServletContextListenerを実装することができますリスナーからプールをシャットダウンおよびシャットダウンします。

0

Beanのシャットダウンメソッドで@Predestroyアノテーションを使用します。コンテキストがシャットダウンしているときにこのメソッドが呼び出されます。

実行中のサービスがバックグラウンドで実行されているかどうかを確認します。 executor.shutdownNow()を呼び出してエグゼキュータをシャットダウンできます。

もここhttp://taranmeet.com/jvm-not-shutting-down-on-spring-context-close/

0

春Bean内のスレッドを起動および停止する方法です参照してください。

@PostConstruct 
public void init() { 
    BasicThreadFactory factory = new BasicThreadFactory.Builder() 
     .namingPattern("myspringbean-thread-%d").build(); 
    executorService = Executors.newSingleThreadExecutor(factory); 
    executorService.execute(new Runnable() { 
    @Override 
    public void run() { 
    try { 
    // do something 
    System.out.println("thread started"); 
    } catch (Exception e) { 
    logger.error("error: ", e); 
    } 

    } 
    }); 
    executorService.shutdown(); 
} 


@PreDestroy 
public void beandestroy() { 
    if(executorService != null){ 
    executorService.shutdownNow(); 
    } 
} 
関連する問題