【发布时间】:2015-09-27 11:35:06
【问题描述】:
我的项目是基于 websphere 8.5 构建的,我们决定在我的项目中使用 JMS quque 作为消息。
所以,我创建了一个名为 MyBus 的总线,还创建了一个目的地 myBusDistination。
然后我创建了一个名为 myConF 的连接工厂
然后我创建了两个 JMS 队列,一个是带有 JNDI jndi/myQueue1 的 myQueue1。另一个是带有 JNDI jndi/mQueue2 的 myQueue2。
然后我创建了两个Activation规范,一个是myAS1 with JNDI jndi/myAS1,另一个是myAS2 with JNDI jndi/myAS2。
然后我创建了两个消息驱动的 bean,它们位于 EJB3.0 中,名为 MyMDB1 和 MyMDB2。 类代码是这样的,
@MessageDriven(mappedName = "jndi/myQueue1", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
public class MyMDB1 implements MessageListener {
@Override
public void onMessage(Message message) {
}
}
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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0" metadata-complete="false">
<display-name>My MDB</display-name>
<enterprise-beans>
<message-driven>
<display-name>MyMDB1</display-name>
<ejb-name>MyMDB1</ejb-name>
<ejb-class>com.test.mdb.MyMDB1</ejb-class>
<message-destination-ref>
<message-destination-ref-name>jndi/myQueue1</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Consumes</message-destination-usage>
<message-destination-link>jndi/myQueue1</message-destination-link>
</message-destination-ref>
</message-driven>
<message-driven>
<display-name>MyMDB2</display-name>
<ejb-name>MyMDB2</ejb-name>
<ejb-class>com.test.mdb.MyMDB2</ejb-class>
<message-destination-ref>
<message-destination-ref-name>jndi/myQueue2</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Consumes</message-destination-usage>
<message-destination-link>jndi/myQueue2</message-destination-link>
</message-destination-ref>
</message-driven>
</enterprise-beans>
而ibm-ejb-jar-bnd.xml是这样的,
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd"
version="1.0">
<message-driven name="MyMDB1">
<jca-adapter activation-spec-binding-name="jndi/myAS1" destination-binding-name="jndi/myQueue1"/>
<message-destination-ref name="jndi/myQueue1" binding-name="jndi/myQueue1" />
</message-driven>
<message-driven name="MyMDB2">
<jca-adapter activation-spec-binding-name="jndi/myAS2" destination-binding-name="jndi/myQueue2"/>
<message-destination-ref name="jndi/myQueue2" binding-name="jndi/myQueue2" />
</message-driven>
最后,这是我的测试代码,
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
props.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809"); InitialContext ctx = new InitialContext(props);
ConnectionFactory factory = (ConnectionFactory) ctx.lookup("jndi/myConF");
Destination destination = (Destination) ctx.lookup("jndi/myQueue1");
Connection conn = factory.createConnection();
Session session = conn.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
ObjectMessage objMsg = session.createObjectMessage();
objMsg.setObject("MDB Test");
producer.send(objMsg);
session.close();
conn.close();
奇怪的是,
消息可以发送出去,消息可以被MDB MyMDB1处理(如果我在MyMDB1.onMesssage()中记录了一些东西)。但是,如果我再次发送消息。该消息将由 MyMDB2 处理。
有人对这个“奇怪的东西”有什么想法吗?
【问题讨论】:
标签: queue jms websphere message-driven-bean