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>