2016-05-02 9 views
3

Weblogic 12.2.1のJavaEE 7アプリケーションでDrools 6.3.0Finalを使用しています。 アプリケーションが最初にデプロイされると、Xが1から8までの8つのスレッド(drools-worker-X)が表示されます(HTのある4コアCPU上)。 アプリケーションを再デプロイすると、8つのスレッドが状態 "Park"に残り、8つの新しいスレッドが作成されます(再び1から8まで番号が付けられます)。これはすべての再デプロイ時に引き続き実行されます。Java EE 7アプリケーションでThreadPoolExecutorを使用するDroolsは、再デプロイ時に問題を引き起こします

パッケージorg.drools.core.concurrentのクラスExecutorProviderImplがcorePoolSizeとmaxPoolSizeの両方をCPUコアの数に設定し、タイムアウトを60に設定して、新しいThreadPoolExecutorを作成しました。 JVMが遅くなり、アプリケーションが正しく実行されなくなったため、一定の回数だけ再デプロイしました。

アプリケーションがシャットダウンしたときにこれらのワーカースレッドを適切にシャットダウンする方法はありますか?

+0

質問のタイトルを変更すると、尋ねていることを伝えることができます。私はEEやdroolsを知らないので推測できますが、私は "droolsアプリケーションをどのように再デプロイするか"、 "ExecutorProviderImplを安全にアプリケーションを使用する方法"などと考えています。 " " –

+0

ThreadPoolExecutorを入手した場合、この方法でシャットダウンすることができます:http://stackoverflow.com/questions/36644043/how-to-forcefully-shutdown-java-executorservice/36644320#36644320 –

+0

Droolsは私たち自身ではなく第三者であるためJava EE 7環境でソフトウェアを安全に使用できるかどうかについては、Droolsの方が多くなっていましたが、これまでに経験したことはありません。 – phivo

答えて

2

@PreDestroy注釈付きメソッドでExecutorServiceをシャットダウンするStartup-EJBを実装できます。私は自分のプロジェクトでそれをテストしましたが、それは魅力的に機能するようです。

import java.util.concurrent.ExecutorService; 
import org.kie.internal.concurrent.ExecutorProviderFactory; 
... 

@Startup 
@Singleton 
public class PlausiServiceLifecycleManager { 

    /** 
    * Shuts down Drools' internal ExecutorService, so that its threads can terminate. 
    */ 
    @PreDestroy 
    public void shutdown() { 
     ExecutorService executor = (ExecutorService) ExecutorProviderFactory.getExecutorProvider().getExecutor(); 
     executor.shutdown(); 
    } 


} 
+0

私たちのアプリケーションであなたのコードを試したところ、うまくいくようです。各再展開の前にドロルズワーカースレッドの数が8増加したとき、再デプロイ後に8スレッドで安定していました。素晴らしい!どうもありがとう! – phivo

関連する問題