我有一个ApplicationScoped bean,它会激活一个单独的Thread来完成一些后台工作。 Thread有一个干净地终止它的方法叫做 terminate()。如果没有通过该方法终止,它将在无限循环中运行,如果发现它无关,则会休眠一段时间。
问题是我处于开发模式(Netbeans - > Maven),每次我重新编译应用程序时,Maven插件都会取消部署并重新部署应用程序(最方便的是我必须说)但背景线程来自最后部署暂停。它最终以异常终止,因为它从睡眠状态唤醒并尝试访问不再存在的JPA EntityManager。
我希望在应用程序停止时自动调用 terminate()方法。有没有办法实现一个在JSF 2.0规范级别执行此操作的侦听器?如果没有,那么在Servlet级别怎么样?
这是使用GlassFish 3.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");
}
}