2011-10-02 74 views
1

我有一個ApplicationScoped bean啓動一個單獨的線程來完成一些後臺工作。線程有一個乾淨的終止方法,叫做terminate()。如果沒有通過該方法終止,它會在無限循環中運行,並且如果它發現它沒有任何事情可以休眠一段時間。如何修復JSF應用程序中的線程泄漏?

事情是我處於開發模式(Netbeans - > Maven),每次我重新編譯應用程序時,Maven插件取消部署和重新部署應用程序(最方便的是我必須說),但後臺線程從部署掛起的最後。它最終終止於一個異常,因爲它從睡眠中醒來並嘗試訪問不存在的JPA EntityManager。

我希望在應用程序停止時自動調用terminate()方法。有什麼方法可以實現一個在JSF 2.0規範級別執行此操作的偵聽器?如果不是,那麼在Servlet級別呢?

這是使用GlassFish 3.1.1。

+1

相關:http://stackoverflow.com/questions/ 7499534/applicationscope-bean-that-uses-a-timertask-sheduler-good-or-bad – BalusC

回答

2

添加@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"); 
    } 
} 
+0

我的應用程序作用域bean是由CDI管理的 - 是否需要處理** PreDestroy **註釋? – AlanObject

+0

是的,我認爲是。 「所有託管bean都支持Java EE @ PostConstruct和@ PreDestroy回調。」,來自:http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/ html_single /#d0e4657 – palacsint

+1

已確認 - 確實有效。我正在使用MyFaces CODI。 – AlanObject