EJB 3.1. Горе проектирования - необходимость создания экземпляров Stateful Beans из MDB - PullRequest
0 голосов
/ 25 ноября 2011

В последнее время я многое узнал об 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 управляется контейнером?

Ответы [ 3 ]

0 голосов
/ 01 декабря 2011

Мы перепроектировали классы и объединили их, чтобы метод onMessage MDB выполнял обработку. Состояние отдельных партий хранится в статической карте на MDB.

0 голосов
/ 10 декабря 2011

Вы можете использовать javax.jms.QueueBrowser для проверки состояния сообщений в очереди, и вы можете использовать селектор и сообщение свойства, чтобы найти конкретный пакетный процесс.

0 голосов
/ 25 ноября 2011

Если вам нужно поддерживать одно состояние для пакетной обработки, как вы указали выше (выполняется, приостановлено, отменено) независимо от пакетов, то есть это состояние применяется ко всем MDB, потребляющим в определенный момент: почему бы вам не реализовать EJB как @Singleton? Таким образом, вы могли бы иметь это состояние в переменной экземпляра в вашем EJB и читать из него MDB.

...