如何在JSF应用程序中修复线程泄漏?

时间:2011-10-02 18:44:28

标签: jsf-2 glassfish glassfish-3

我有一个ApplicationScoped bean,它会激活一个单独的Thread来完成一些后台工作。 Thread有一个干净地终止它的方法叫做 terminate()。如果没有通过该方法终止,它将在无限循环中运行,如果发现它无关,则会休眠一段时间。

问题是我处于开发模式(Netbeans - > Maven),每次我重新编译应用程序时,Maven插件都会取消部署并重新部署应用程序(最方便的是我必须说)但背景线程来自最后部署暂停。它最终以异常终止,因为它从睡眠状态唤醒并尝试访问不再存在的JPA EntityManager。

我希望在应用程序停止时自动调用 terminate()方法。有没有办法实现一个在JSF 2.0规范级别执行此操作的侦听器?如果没有,那么在Servlet级别怎么样?

这是使用GlassFish 3.1.1。

1 个答案:

答案 0 :(得分:2)

向bean添加@PreDestroy方法,该方法将在取消部署或停止应用程序时运行,并且可以停止后台线程,如下所示:

import javax.annotation.PreDestroy;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ApplicationScoped
@ManagedBean
public class AppBean {

    public AppBean() {
        System.out.println("new AppBean()");
    }

    @PreDestroy
    public void preDestory() {
        // call thread.terminate() here
        System.out.println("preDestory");
    }
}