В последнее время я многое узнал об EJB3.1, но, видимо, этого недостаточно. Вот моя история о горе ...
У меня есть война с сервлетом, в которую можно загружать командные файлы. Сервлет проверяет файл, сохраняет данные файла в базе данных и отправляет сообщение в очередь о получении нового пакета. Это все отлично работает.
У меня есть ухо с развернутым ejb-jar, в котором есть MDB, который прослушивает сообщения, полученные новыми партиями.
Он также имеет EJB с отслеживанием состояния (с использованием представления без интерфейса), который выполняет фактическую пакетную обработку. EJB имеет ссылки на bean-объекты службы сущностей JPA без сохранения состояния, и поэтому ему необходимо управлять контейнером, чтобы вводить контейнер в EntityManager.
Мне нужно создавать экземпляр компонента с сохранением состояния при каждом получении сообщения MDB. Я не смог найти ни одного примера / учебника, которые бы охватывали этот сценарий.
Я пытался внедрить bean-компонент с состоянием в 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 с состоянием не должны вводиться. Это имеет смысл.
У меня вопрос: как еще можно создать экземпляр моего EJB с состоянием, когда MDB получает сообщение и убедиться, что EJB управляется контейнером?