在 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 中的 class ExecutorProviderImpl 创建了一个新的 ThreadPoolExecutor,其 corePoolSize 和 maxPoolSize 均设置为 CPU 内核数,超时设置为 60 秒。 一旦我们重新部署了一定次数,JVM 就会变慢并且我们的应用程序不再 运行 正确。

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

您可以实现 Startup-EJB,它在 @PreDestroy 注释方法中关闭 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();
    }


}