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