2011-10-02 4 views
1

ApplicationScoped 빈을 가지고 백그라운드 작업을 수행하는 별도의 스레드를 실행합니다. 쓰레드에는 terminate()이라는 이름으로 끝내는 메소드가 있습니다. 해당 메서드를 통해 종료되지 않으면 무한 루프에서 실행되고 아무 것도 수행하지 않으면 잠시 동안 잠자기 상태가됩니다.JSF 응용 프로그램에서 스레드 누수를 수정하려면 어떻게합니까?

문제는 내가 개발 모드 (Netbeans -> Maven)이고 응용 프로그램을 다시 컴파일 할 때마다 Maven 플러그 인이 응용 프로그램을 배포 취소하고 재배포합니다 (가장 편리하게 말해야 함)하지만 배경 스레드는 마지막 배포가 중단됩니다. 잠자기에서 깨어나 더 이상 존재하지 않는 JPA EntityManager에 액세스하려고하기 때문에 결국 Exception으로 종료됩니다.

응용 프로그램이 중지되면 terminate() 메서드를 자동으로 호출하는 것이 좋습니다. JSF 2.0 스펙 레벨에서이를 수행 할 리스너를 구현할 수있는 방법이 있습니까? 그렇지 않다면 서블릿 레벨은 어떨까요?

이것은 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

예, 그렇게 생각합니다. "자바 EE'@ PostConstruct'와'@ PreDestroy' 콜백은 모든 관리 빈에 대해서도 지원됩니다.", http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/ html_single/# d0e4657 – palacsint

+1

확인 - 작동하지 않습니다. MyFaces CODI를 사용하고 있습니다. – AlanObject

관련 문제