요즘 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를 인스턴스화 할 수 있습니까?
왜 EJB가 상태 유지가 필요합니까? –
다른 배치와 독립적으로 변경 (실행, 일시 중지, 취소) 할 수있는 배치 처리 상태를 추적해야하기 때문에. – sdoca
또한 배치 프로세서는 단일 배치를 처리하므로 상태의 일부가 "배치"를 추적합니다. – sdoca