在 Tomcat 取消部署期间未调用 @ViewScoped CDI bean 的 @PreDestroy 方法

@PreDestroy methods of @ViewScoped CDI beans not called during Tomcat undeploy

我正在使用带有 javax.inject.Namedorg.omnifaces.cdi.ViewScoped 注释的 CDI 托管 bean。此 bean 中的一个特定功能将打开一个单独的线程来持续更新成员字段(如果用户决定在 Web 界面中激活它)。

只要用户停留在页面上,该线程就应该 运行(PrimeFaces poll 组件将确保视图不会过期)。

这个线程应该尽快停止

我正在使用 @PreDestroy 方法来停止线程。我的问题是 @PreDestroy 方法在 Tomcat 取消部署期间未被调用并导致内存泄漏警告:

 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [webapp] appears to have started a thread named [pool-7-thread-1] but has failed to stop it. This is very likely to create a memory leak.

这种行为是预期的吗?如果是,清理 CDI 托管 bean 中的资源的推荐方法是什么?

我 运行 我的 Web 应用程序使用 JDK8 和 Tomcat 8.5(CDI 1.2 / WELD 2.4.5、OmniFaces 2.6.8、JSF 2.2 / Mojarra 2.2.14)。

我试图通过 ExecutorService.shutdownNow() 关闭我的 运行 线程,并将 ExecutorService 对象存储为临时成员变量。问题似乎是序列化是在调用 @PreDestroy 方法之前完成的,这导致关闭调用静默失败。

我完全摆脱了 @PreDestroy 方法并切换到一个静态成员变量,我从 ServletContextListener.contextInitialized() 初始化一次并从 ServletContextListener.contextDestroyed().

停止

抱歉误报!