2010-12-02 4 views
2

EJB3.0 컨테이너에서 하우스 키핑 스레드를 실행할 필요가 있습니다. 우리는 현재 "TimerService"@Stateless EJB가 필요합니다 (다른 @EJB가 삽입되어 있기 때문에 필요합니다). startTimer() 메소드가 호출 될 때 간격 EJB 타이머를 생성합니다. 이 타이머 스레드의 인스턴스는 하나만 있어야합니다. 현재 솔루션은 서블릿 중 하나의 init() 메소드에서 startTimer()를 호출하는 것을 포함합니다. 서블릿은 web.xml을 사용하여 시작할 때 강제로로드되지만, 일을 수행하는 올바른 방법 대신 우발적 인 동작처럼 느껴집니다 . 우리는 이미 다른 사람이 그 서블릿을 서브 클래스 화했기 때문에 문제가있었습니다. 즉, init()이 두 번 호출되었으므로 두 개의 타이머 스레드를 의미했습니다.EJB3.0 컨테이너의 단일 백그라운드 스레드

이 작업은 비정상적인 요구 사항이 아닌 것처럼 느껴지므로이 작업을 수행하는 적절한 방법은 무엇입니까? 컨테이너에있는 다른 리소스에 묶지 않고 시작될 때 컨테이너에 스레드를 시작하도록 요청하는 간단한 방법이 있어야하는 것처럼 보입니다.

+0

아마도 관련이 있습니까? http://stackoverflow.com/questions/2707733/eager-auto-loading-of-ejb-load-ejb-on-startup-on-jboss – Bozho

+0

감사합니다. 승인 된 대답은 EJB3.1에 적용됩니다. 우리는 그렇지 않습니다. 사용하고 있지만 흥미로운 점은 다른 대답입니다. 3.1 이전의 가장 좋은 방법은 현재 사용하고있는 솔루션입니다. ( – RevBingo

답변

0

앱 서버가 "스타트 업빈"을 지원합니까? WebSphere Application Server에는 관리 콘솔에서 서버 시작시 "시작 bean"을 시작하도록 서버를 설정할 수있는 옵션이 있기 때문에 묻습니다. 우리는 많은 "과부하"와 초기화가 필요한 특정 응용 프로그램에이를 사용하므로 최종 사용자 환경의 시작 시간을 최소화 할 수 있습니다. WAS 6 문서에 대한 링크입니다 (예전에 알고 있었지만 여전히 도움이되었습니다). Startup beans

나는 이것이 IBM WebSphere에만 한정된 것으로 알고 있지만, 귀하의 응용 프로그램 서버 (WebSphere가 아닌 경우)가 당신을 도울 수있는 것과 비슷한 것을 가지고 있습니까?

+0

JBoss 5.1.0을 사용하고 있습니다. 빠른 Google은 비슷한 기능을 공개하지 않았습니다. – RevBingo

0

2 가지 해결책을 제안하고 싶습니다.

1 구현에 대한 수정. 서블릿을 마지막으로 만드십시오. 이것은 서브 클래 싱을 피할 것이다. 그러나 서블릿은 여전히 ​​두 번 배포 될 수 있습니다. 이를 피하기 위해 정적 부울 변수를 서블릿에 작성하십시오. init는이 변수를 검사해야합니다. 거짓이면 true로 설정하고 계속합니다. 그렇지 않으면 예외가 발생합니다.

이것은 현재 수행 할 수있는 빠른 수정입니다. 하지만 "올바른"해결책은 아닙니다. 예를 들어 클러스터 된 환경에서는 작동하지 않습니다.

2 2 개의 "올바른"해결책이 있습니다.

2.1. 석영을 사용하십시오.

2.2. JCA를 사용하여 타이머를 구현하십시오. 커넥터는 스레드와 타이머를 합법적으로 사용할 수있는 J2EE의 유일한 장소입니다.

나는이 문서에서 다른 맥락에서 JCA을 언급 : http://alexradzin.blogspot.com/2010/10/send-delayed-jms-messages.html 당신은 그것을보고 아마 당신을 도울 수 짧은 코드 샘플을 볼에 오신 것을 환영합니다.

1

EJB < 3.1의 경우 응용 프로그램 서버를 특정 또는 해킹해야합니다. JBoss를 사용한다고 언급 했으므로 라이프 사이클 메소드를 정의한 @Management 태그를 사용할 수 있습니다.

관련 문제