我们正在Weblogic 12.2.1上的JavaEE 7应用程序中使用Drools 6.3.0Final。
最初部署我们的应用程序时,我们看到8个名为“drools-worker-X”的线程,其中X的范围是1到8(在具有HT的4核CPU上)。
现在,当我们重新部署应用程序时,这8个线程保持在“Park”状态,并创建了8个新线程(再次从1到8编号)。每次重新部署都将继续进行。

我们在包org.drools.core.concurrent中发现了ExecutorProviderImpl类,创建了一个新的ThreadPoolExecutor,其中corePoolSize和maxPoolSize都设置为CPU内核数,超时设置为60s。
一旦我们重新部署了一定次数,JVM就会变慢并且我们的应用程序将无法正常运行。

当我们的应用程序关闭时,有什么方法可以正确地关闭那些工作线程吗?

最佳答案

您可以实现一个Startup-EJB,它通过ExecutorService注释的方法关闭@PreDestroy。我只是在我们自己的项目中对其进行了测试,它看起来就像是一种魅力。

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();
    }


}

10-06 15:59
查看更多