繁体   English   中英

在Java EE 7应用程序中使用ThreadPoolExecutor进行Drools会导致重新部署问题

[英]Drools using ThreadPoolExecutor in Java EE 7 application causes problems on redeploy

我们在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核心数,Timeout设置为60s。 一旦我们重新部署了一定次数,JVM就会变慢并且我们的应用程序不再正常运行。

当我们的应用程序关闭时,有没有办法正确关闭这些工作线程?

您可以实现一个Startup-EJB,它在@PreDestroy -annotated方法中关闭ExecutorService 我只是在我们自己的项目中测试它,它看起来像一个魅力。

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


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM