Как я могу определить пользовательские (экземплярные) свойства для и MDB (EJB) в JBoss 7

Я хочу развернуть два экземпляра одного и того же MDB для обработки сообщений из двух разных очередей под jboss7 с помощью ActiveMQ. Итак, это часть моего файла ejb-jar.xml:

<message-driven>
    <ejb-name>FirstInstanceOfMyMDB</ejb-name>
    <ejb-class>de.xx.xx.MyMDB</ejb-class>
    <activation-config>
        <activation-config-property>
            <activation-config-property-name>destination</activation-config-property-name>
            <activation-config-property-value>activemq/queue/queue_1</activation-config-property-value>
        </activation-config-property>
        <activation-config-property>
            <activation-config-property-name>destinationType</activation-config-property-name>
            <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
        </activation-config-property>
    </activation-config>
</message-driven>

<message-driven>
    <ejb-name>SecondInstanceOfMyMDB</ejb-name>
    <ejb-class>de.xx.xx.MyMDB</ejb-class>
    <activation-config>
        <activation-config-property>
            <activation-config-property-name>destination</activation-config-property-name>
            <activation-config-property-value>activemq/queue/queue_2</activation-config-property-value>
        </activation-config-property>
        <activation-config-property>
            <activation-config-property-name>destinationType</activation-config-property-name>
            <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
        </activation-config-property>
    </activation-config>
</message-driven>

С этой конфигурацией все работает хорошо.

Теперь я хочу добавить некоторые свойства для каждого экземпляра: System = A для FirstInstanceOfMyMDB и System = B для SecondInstanceOfMyMDB.

Я уже пытался использовать внутри, чтобы ввести System с аннотацией @Resource:

<message-driven>
        <ejb-name>FirstInstanceOfMyMDB</ejb-name>
        ...
<env-entry>
          <env-entry-name>System</env-entry-name>
          <env-entry-type>java.lang.String</env-entry-type>
          <env-entry-value>A</env-entry-value>
    </env-entry>
</message-driven>

<message-driven>
        <ejb-name>SecondInstanceOfMyMDB</ejb-name>
        ...
    <env-entry>
          <env-entry-name>System</env-entry-name>
          <env-entry-type>java.lang.String</env-entry-type>
          <env-entry-value>B</env-entry-value>
    </env-entry>
</message-driven>

Но jboss, кажется, устанавливает System только один раз либо в A, либо в B. Возможно, потому, что одно и то же пространство имен используется для установки System.

Итак, мой вопрос: как лучше всего установить свойства пользовательского экземпляра MDB (EJB)?

Используя подход, предложенный пользователем 1181247:

@Resource(name="System")
private String System;

Я могу развернуть свои MDB в модуле ejb с файлом ejb-jar.xml в каталоге METH-INF и работать по желанию. Пытаясь развернуть те же классы в файле войны с тем же ejb-jar.xml в папке WEB-INF, я получаю следующее исключение:

[0m[31m09:13:56,823 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."Server.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."Server.war".INSTALL: JBAS018733: Failed to process phase INSTALL of deployment "Server.war"
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:127) [jboss-as-server-8.0.0.Alpha1-SNAPSHOT.jar:8.0.0.Alpha1-SNAPSHOT]
    ...
Caused by: java.lang.IllegalArgumentException: JBAS011053: Incompatible conflicting binding at java:comp/env/System source: org.jboss.as.ee.component.EnvEntryInjectionSource@1291e

Если значение env-entry-value для обоих экземпляров одинаковое, развертывание выполняется без исключений!

Нужна ли мне другая/дополнительная конфигурация для файла войны?


person sam    schedule 28.11.2013    source источник


Ответы (2)


Я проделал примерно такую ​​же инъекцию со своими MDB, которые когда-то работали с AS7 (сейчас я использую EAP). Единственная возможная разница, которую я вижу между тем, что работало с моим, и тем, что есть у вас, заключается в том, что я назвал свои ресурсы. Итак, попробуйте это, если вы еще этого не сделали:

@Resource(name = "sysId")
protected String sysId;

Подробнее... Я тестировал следующие программы на EAP, но раньше работал на 7.1.1.

Мой МДБ:

public class TestMDB implements MessageListener {
    private static final Logger l = Logger.getLogger(TestMDB.class);

    @Resource(name="sysId")
    private String sysId;

    public void onMessage(Message arg0) {
        try {
            l.info("Received message " + sysId + " - " + ((TextMessage) arg0).getText());
        }
        catch (JMSException e) {
            l.error("Failed to get message", e);
        }
    }

}

из моего ejb-jar

    <enterprise-beans>
        <message-driven>
            <ejb-name>receiver1</ejb-name>
            <ejb-class>com.xxxx.test.JMSTest.TestMDB</ejb-class>
            <activation-config>
                <activation-config-property>
                    <activation-config-property-name>destinationType</activation-config-property-name>
                    <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                    <activation-config-property-name>destination</activation-config-property-name>
                    <activation-config-property-value>queue/xxxin</activation-config-property-value>
                </activation-config-property>
            </activation-config>
            <env-entry>
                <env-entry-name>sysId</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>ID1</env-entry-value>
            </env-entry>
        </message-driven>
        <message-driven>
            <ejb-name>receiver2</ejb-name>
            <ejb-class>com.xxxx.test.JMSTest.TestMDB</ejb-class>
            <activation-config>
                <activation-config-property>
                    <activation-config-property-name>destinationType</activation-config-property-name>
                    <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                    <activation-config-property-name>destination</activation-config-property-name>
                    <activation-config-property-value>queue/xxxinit</activation-config-property-value>
                </activation-config-property>
            </activation-config>
            <env-entry>
                <env-entry-name>sysId</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>ID2</env-entry-value>
            </env-entry>
        </message-driven>
    </enterprise-beans>

Вывод:

11:43:20,082 INFO [com.xxxx.test.JMSTest.TestMDB] (Thread-2 (HornetQ-client-global-threads-319126730)) Получено сообщение ID1 — привет

11:43:25,088 INFO [com.xxxx.test.JMSTest.TestMDB] (Thread-2 (HornetQ-client-global-threads-319126730)) Получено сообщение ID2 — hi2

person Marc    schedule 28.11.2013
comment
Спасибо за ваш ответ. - person sam; 29.11.2013
comment
Этот подход работает, когда MDB развернут как jar (ejb-модуль), но не работает, если он развернут в файле войны. Я закончил свой вопрос. - person sam; 29.11.2013
comment
@sam Хммммм ... вы пробовали это на чем-нибудь более стабильном, например 7.1.3? - person Marc; 29.11.2013

Я заметил это в спецификации EJB:

16.2.1 Совместное использование записей среды

Для корпоративных компонентов, упакованных в ejb-jar, каждый корпоративный компонент определяет свой собственный набор записей среды. В этом случае все экземпляры корпоративного компонента используют одни и те же записи среды; записи среды не используются совместно с другими корпоративными компонентами.

В .war существует только одна среда именования, совместно используемая всеми компонентами модуля. Для корпоративных компонентов, упакованных в .war, все корпоративные компоненты совместно используют эту единую среду именования. Корпоративные компоненты совместно используют свои записи среды со всеми другими компонентами корпоративных компонентов и веб-компонентами в файле .war.

Итак, почему-то кажется, что подход env-entry будет работать, если вы развернете ejb jar, но не войну. Возможно, вы разделите свое приложение и перейдете к развертыванию в ухе, если это возможно.

person Marc    schedule 29.11.2013