我们在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就会变慢,我们的应用程序就不再正常运行了。
当我们的应用程序关闭时,有没有办法正确关闭这些工作线程?
答案 0 :(得分:2)
您可以实现一个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();
}
}