2012-03-16 4 views
0

다음을 수행하기 위해 Java EE 환경에서 "승인 된"또는 모범 사례 접근 방식을 결정하려고합니다. 클라이언트가 웹 페이지에 있으며 버튼을 클릭하고 있습니다. 이것은 프로세스, 즉 데이터베이스 활동, 네트워크 등을 모니터링하기위한 스레드를 시작합니다.이 프로세스는 사용자가 프로세스를 종료하도록 지시하는 버튼을 클릭 할 때까지 계속 실행됩니다. 다른 클라이언트 및/또는 동일한 클라이언트가 버튼을 클릭하여 프로세스에서 전송 된 상태를 듣고 사용자가 단추를 클릭하여 청취를 중단 할 때까지 계속 듣습니다.Java EE 및 백그라운드 스레드

나는 WebSocketApplication을 확장하는 삽입 된 단일 EJB를 얻는 서블릿과 통신하기 위해 WebSocket을 사용하여 이미 위 작업을 수행했다. 하지만,이 EJB는 프로세스 스레드를 생성하여 모니터링을 수행합니다. 그것이 작동하기는하지만 싱글 톤이기 때문에 계속해서 작동해야하지만, "승인 된"방법은 아닙니다.

몇 가지 제안은 스레드를 스폰하기 위해 JMS를 사용하여 논의했지만, 뭔가 오해하지 않는 한 Message Driven Bean이 스레드를 생성하지 않기 때문에 아무 것도 해결하지 못합니다. 그렇다면이 작업을 수행하는 데있어 승인 된/최선의 방법은 무엇입니까? Java EE 환경에서 백그라운드 프로세스를 시작하고 중지하는 방법은 무엇입니까? 다시 말하면 요구 사항은 오직 하나의 프로세스 만 생성 될 수 있고 서블릿에 등록 된 모든 웹 소켓에 통신해야하며 요청할 때 죽을 수 있어야한다는 것입니다 (서버가 소켓을 닫지는 않을지라도 백업을 시작하고 이전에 등록한 모든 클라이언트와 계속 통신합니다).

감사합니다.

답변

1

이 EJB는

EJB에 not permitted to start threads가있는 프로세스 스레드 산란된다. Quoth 표준 :

엔터프라이즈 bean은 스레드를 관리하지 말아야합니다. 엔터프라이즈 빈은 스레드를 시작, 중지, 일시 중단 또는 다시 시작하거나 스레드의 우선 순위 또는 이름을 변경하려고 시도하지 말아야합니다 (예 : ). prize bean은 스레드 그룹을 관리하려고 시도하면 안됩니다.

이러한 함수는 EJB 컨테이너 용으로 예약되어 있습니다. 엔터프라이즈 bean이 스레드 을 관리하도록 허용하면 컨테이너가 런타임 환경을 적절히 관리하는 능력이 떨어집니다.

이것은 의도적으로 설계된 것입니다. 사양 상태는 다음과 같은

엔터프라이즈 자바 빈즈 아키텍처는 쉽게 응용 프로그램을 작성할 수 있도록합니다 : 응용 프로그램 개발자가 낮은 수준의 트랜잭션 및 상태 관리 세부 사항, 멀티 스레딩, 연결 풀링, 또는 기타 이해 할 필요가 없습니다 복잡한 저수준 API.

Stateful Session Bean을 사용 해본 적이 있습니까? 버튼을 클릭하면 빈이 "시작됨"상태가됩니다. 두 번째 버튼을 클릭하면 빈이 "중지됨"상태가됩니다.

0

답변은 비동기 EJB 3.1 bean입니다. 답장을 보내 주셔서 감사합니다.

1

엔터프라이즈 환경에서 스레드를 만들려면 ManagedThreadFactory 또는 ManagedExecutorService를 사용해야합니다.

관리되는 스레드 풀로 EJB에 액세스 권한을 부여하기 위해 ManagedExecutorService을 사용할 수 있습니다 EE 7 자바로 here