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

时间:2018-11-07 12:26:43

标签: jsf cdi omnifaces

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

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

该线程应尽快停止

  • 用户停用Web界面中的功能(有效)
  • 用户导航到其他页面(工作)
  • 该Web应用程序已被Tomcat取消部署(不起作用)

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

 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中清理资源的推荐方法是什么?

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

1 个答案:

答案 0 :(得分:0)

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

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

对不起,误报警!