Связать один и тот же Java-класс Mdb с несколькими очередями на сервере Ejb3 jboss 5.x - PullRequest
1 голос
/ 24 марта 2012
 package jboss5.ejb3.mdb;

import java.util.HashMap;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.naming.InitialContext;

@MessageDriven(
    activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName="destination", propertyValue="queue/Queue1"),
    }
    )

@TransactionManagement(TransactionManagementType.CONTAINER)
@EJB(name = "EJB3MessageDrivenLocal1", beanInterface = EJB3MessageDrivenLocal.class)

 public class EJB3MessageDrivenBean implements MessageDrivenBean, MessageListener
 {
ObjectMessage msg = null;
private MessageDrivenContext mdc = null;

public EJB3MessageDrivenBean() {}

public void setMessageDrivenContext(MessageDrivenContext mdc) {
    this.mdc = mdc;
}

public void onMessage(Message inMessage) {
        }

@Override
public void ejbRemove() throws EJBException {
    // TODO Auto-generated method stub
}
 }

Выше кода мой компонент, управляемый сообщениями, и он отлично работает для одной очереди 'Queue1'. Теперь я хочу связать Queue2 с той же MDB. Я могу сделать то же самое, создав другой класс mdb "EJB3MessageDrivenBean2" и просто изменив свойство ActivationConfig, как показано ниже.

    @MessageDriven(
    activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName="destination", propertyValue="queue/Queue2"),
    }
    )

но в этом методе я должен повторить свой код, и в будущем, если мне нужно будет связать другую очередь Queue3, мне придется снова копировать Java-файл.

Любой другой метод путем изменения в XML-файле или любым другим методом.

БОЛЬШЕ ДЕТАЛЕЙ

Допустим, сообщение в очереди 1: JmsMsg11, JmsMsg12, JmsMsg13, JmsMsg14 Допустим, сообщение в очереди 2: JmsMsg21, JmsMsg22, JmsMsg23, JmsMsg24

Я должен обрабатывать JmsMsg11 и JmsMsg21 одновременно. После обработки JmsMsg11 мне нужно обработать JmsMsg12, затем JmsMsg13, затем JmsMsg14. То же самое относится и к очереди 2.

Я сделал то же самое в weblogic 10.x, внеся некоторые изменения в ejb-jar.xml и weblogic-ejb-jar.xml, следуя коду. не знаю, как это сделать в jboss 5.x. ejb-jar.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
    <enterprise-beans>
    <message-driven>
      <ejb-name>WeblogicEjb3MDB1</ejb-name>
      <ejb-class>jboss5.ejb3.mdb.EJB3MessageDrivenBean</ejb-class>
      <messaging-type>javax.jms.MessageListener</messaging-type>
  <transaction-type>Container</transaction-type>

<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>
            DestinationJndiName
        </activation-config-property-name>
        <activation-config-property-value>
           Queue1
        </activation-config-property-value>
    </activation-config-property>
    <activation-config-property>
        <activation-config-property-name>
            ConnectionFactoryJndiName
        </activation-config-property-name>
        <activation-config-property-value>
            QFact1
        </activation-config-property-value>
    </activation-config-property>
   </activation-config>
 </message-driven>
     <message-driven>
       <ejb-name>WeblogicEjb3MDB2</ejb-name>
       <ejb-class>jboss5.ejb3.mdb.EJB3MessageDrivenBean</ejb-class>
       <messaging-type>javax.jms.MessageListener</messaging-type>
       <transaction-type>Container</transaction-type>

   <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>
            DestinationJndiName
        </activation-config-property-name>
        <activation-config-property-value>
           Queue2
        </activation-config-property-value>
    </activation-config-property>
    <activation-config-property>
        <activation-config-property-name>
            ConnectionFactoryJndiName
        </activation-config-property-name> 
        <activation-config-property-value>
            QFact2
        </activation-config-property-value>
    </activation-config-property>
     </activation-config>
   </message-driven>
 </enterprise-beans>

   <assembly-descriptor>
        <container-transaction>
          <method>
             <ejb-name>WeblogicEjb3MDB1</ejb-name>
             <method-name>onMessage</method-name>
         </method>
  <trans-attribute>NotSupported</trans-attribute>
</container-transaction>

<container-transaction>
  <method>
    <ejb-name>WeblogicEjb3MDB2</ejb-name>
    <method-name>onMessage</method-name>
  </method>
  <trans-attribute>NotSupported</trans-attribute>
</container-transaction>

weblogic-ejb-jar.xml

    <!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>


   <!-- Generated XML! -->

   <weblogic-ejb-jar>
    <weblogic-enterprise-bean>
      <ejb-name>WeblogicEjb3MDB1</ejb-name>
        <message-driven-descriptor>
         <pool>
        <max-beans-in-free-pool>1</max-beans-in-free-pool>
         </pool>

       <destination-jndi-name>Queue1</destination-jndi-name>
    </message-driven-descriptor>

      <transaction-descriptor>
    <trans-timeout-seconds>600</trans-timeout-seconds>
     </transaction-descriptor>

  </weblogic-enterprise-bean>

  <weblogic-enterprise-bean>
     <ejb-name>WeblogicEjb3MDB2</ejb-name>
       <message-driven-descriptor>
         <pool>
        <max-beans-in-free-pool>1</max-beans-in-free-pool>
         </pool>
       <destination-jndi-name>Queue2</destination-jndi-name>
      </message-driven-descriptor>

     <transaction-descriptor>
    <trans-timeout-seconds>600</trans-timeout-seconds>
     </transaction-descriptor>

  </weblogic-enterprise-bean>
 </weblogic-ejb-jar>
...