我正在使用带有javax.inject.Named
和org.omnifaces.cdi.ViewScoped
批注的CDI托管bean。该bean中的一项特定功能将打开一个单独的线程以连续更新成员字段(如果用户决定在Web界面中激活它)。
只要用户停留在页面上,该线程就应一直运行(PrimeFaces poll
组件将确保视图不会过期)。
该线程应尽快停止
我正在使用@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应用程序。
答案 0 :(得分:0)
我试图通过ExecutorService.shutdownNow()
关闭正在运行的线程,并将ExecutorService
对象存储为临时成员变量。问题似乎在于序列化是在调用@PreDestroy
方法之前完成的,该方法导致shutdown调用无提示失败。
我完全摆脱了@PreDestroy
方法,并切换到一个静态成员变量,该变量从ServletContextListener.contextInitialized()
初始化一次,然后从ServletContextListener.contextDestroyed()
停止。
对不起,误报警!