在 Tomcat 取消部署期间未调用 @ViewScoped CDI bean 的 @PreDestroy 方法
@PreDestroy methods of @ViewScoped CDI beans not called during Tomcat undeploy
我正在使用带有 javax.inject.Named
和 org.omnifaces.cdi.ViewScoped
注释的 CDI 托管 bean。此 bean 中的一个特定功能将打开一个单独的线程来持续更新成员字段(如果用户决定在 Web 界面中激活它)。
只要用户停留在页面上,该线程就应该 运行(PrimeFaces poll
组件将确保视图不会过期)。
这个线程应该尽快停止
- 用户停用网络界面中的功能(有效)
- 用户导航到不同的页面(有效)
- Web 应用程序正在被 Tomcat 取消部署(不起作用)
我正在使用 @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()
.
停止
抱歉误报!
我正在使用带有 javax.inject.Named
和 org.omnifaces.cdi.ViewScoped
注释的 CDI 托管 bean。此 bean 中的一个特定功能将打开一个单独的线程来持续更新成员字段(如果用户决定在 Web 界面中激活它)。
只要用户停留在页面上,该线程就应该 运行(PrimeFaces poll
组件将确保视图不会过期)。
这个线程应该尽快停止
- 用户停用网络界面中的功能(有效)
- 用户导航到不同的页面(有效)
- Web 应用程序正在被 Tomcat 取消部署(不起作用)
我正在使用 @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()
.
抱歉误报!