0

요즘 EJB3.1에 대해 많이 배웠지 만 외관상으로는 충분하지 않습니다. 여기 제 화제의 이야기가 있습니다 ...EJB 3.1 디자인 문제 - MDB에서 상태 저장 빈을 인스턴스화해야합니다.

배치 파일을 업로드 할 수있는 서블릿과의 전쟁이 있습니다. 서블릿은 파일의 유효성을 검사하고 파일 데이터를 데이터베이스에 저장하며 새로운 일괄 처리가 수신되었다는 메시지를 대기열로 보냅니다. 이 모든 것이 잘 작동합니다.

새 배치 수신 메시지를 수신 대기하는 MDB가있는 ejb-jar가있는 귀가 있습니다.

실제 배치 처리를 수행하는 상태 유지 EJB (인터페이스 없음보기 사용)도 있습니다. EJB는 Stateless JPA 엔티티 서비스 빈에 대한 참조를 가지므로 컨테이너 주입 EntityManagers를 가져 오기 위해 컨테이너 관리가 필요합니다.

MDB가 메시지를 수신 할 때마다 Stateful 프로세서 빈의 인스턴스를 만들어야합니다. 이 시나리오를 다루는 예제/튜토리얼을 찾을 수 없었습니다.

나는 MDB에 상태 빈을 주입 시도했지만 작동하지 않습니다 :

[#|2011-11-24T13:25:45.470-0700|SEVERE|glassfish3.1.1|javax.enterprise.system.container.ejb.mdb.com.sun.ejb.containers|_ThreadID=21;_ThreadName=Thread-2;|MDB00050: Message-driven bean [MyProcessor-ear-1.0:MyMDB]: Exception in creating message-driven ejb : [com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=my.package.MyMDB/myEJB,Remote 3.x interface =my.package.MyEJB,ejb-link=null,lookup=,mappedName=,jndi-name=my.package.MyEJB,refType=Session into class my.package.MyMDB: Lookup failed for 'java:comp/env/my.package.MyMDB/myEJB' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}]|#] 

분명히이 나쁜 설계 방식을 어쨌든 MDB를 본질적으로 상태 비 때문에 상태 EJB를 주입해서는 안 때문이다. 이것은 의미가 있습니다.

내 질문에 MDB가 메시지를 수신하고 EJB가 컨테이너로 관리되고 있는지 확인하기 위해 어떻게 내 상태있는 EJB를 인스턴스화 할 수 있습니까?

+0

왜 EJB가 상태 유지가 필요합니까? –

+0

다른 배치와 독립적으로 변경 (실행, 일시 중지, 취소) 할 수있는 배치 처리 상태를 추적해야하기 때문에. – sdoca

+0

또한 배치 프로세서는 단일 배치를 처리하므로 상태의 일부가 "배치"를 추적합니다. – sdoca

답변

0

MDB의 onMessage 메서드가 처리하도록 클래스를 다시 디자인하고 병합했습니다. 일괄 처리의 상태는 MDB의 정적지도에 저장됩니다.

0

일괄 처리와는 별도로 위에서 언급 한 (실행 중, 일시 중지됨, 취소됨) 상태에서 일괄 처리를위한 단일 상태를 유지해야하는 경우, 즉 특정 순간에 사용하는 모든 MDB에 상태가 적용됩니다. EJB를 @Singleton으로? 이렇게하면 EJB의 인스턴스 변수에 MDB를 읽고 그 상태를 가질 수 있습니다.

+0

상태는 MDB에 적용되지 않으며, 주어진 EJB에 적용됩니다. MDB는 새로운 일괄 처리가 수신되었고 처리 EJB를 생성/시작해야한다는 메시지를 수신합니다. 프록 싱 EJB는 등록 된 리스너 인 다른 MDB를 통해 상태 변경 메시지를받습니다. – sdoca

0

javax.jms.QueueBrowser를 사용하여 대기열의 메시지 상태를 검사 할 수 있으며 선택기와 속성 메시지를 사용하여 구체적인 일괄 처리 프로세스를 찾을 수 있습니다.

관련 문제