MDB代码:
package com.persia.ejb; import javax.ejb.MessageDriven; import javax.ejb.ActivationConfigProperty; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven( activationConfig={ @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"), @ActivationConfigProperty(propertyName="destination",propertyValue="topic/mytopic") } ) public class MyTopicMDB implements MessageListener { public void onMessage(Message msg) { try { TextMessage tm=(TextMessage)msg; System.out.println("my topic mdb 01 被调用 "+tm.getText()); } catch (JMSException e) { e.printStackTrace(); } } }
总共有01,02,03这三个topic的MDB
客户端:
package com.persia.ejb.mdb; import java.util.Properties; import javax.jms.JMSException; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.naming.InitialContext; import javax.naming.NamingException; public class TopicMdbClient { /** * @param args * @throws NamingException * @throws JMSException */ public static void main(String[] args) throws NamingException, JMSException { Properties props=new Properties(); props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url","localhost:1099"); props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming"); InitialContext context=new InitialContext(props); //获得TopicConnectionFactory对象 TopicConnectionFactory factory=(TopicConnectionFactory) context.lookup("ConnectionFactory"); //创建TopicConnection TopicConnection connection=factory.createTopicConnection(); //创建TopicSession对象 TopicSession session=connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); //获取destination对象 Topic topic=(Topic) context.lookup("topic/mytopic"); //创建文本消息 TextMessage txt=session.createTextMessage("hello persia!"); //创建发布者 TopicPublisher publisher=session.createPublisher(topic); //发布消息 publisher.send(txt); //关闭会话 session.close(); connection.close(); System.out.println("消息已经发布!"); } }
运行结果:
19:07:28,859 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.mdb.MDB 19:07:28,859 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=MDBdemo.jar,name=MyTopicMDB02,service=EJB3 with dependencies: 19:07:28,859 INFO [EJBContainer] STARTED EJB: com.persia.ejb.MyTopicMDB02 ejbName: MyTopicMDB02 19:07:28,875 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.mdb.MDB 19:07:28,875 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=MDBdemo.jar,name=MyTopicMDB03,service=EJB3 with dependencies: 19:07:28,890 INFO [EJBContainer] STARTED EJB: com.persia.ejb.MyTopicMDB03 ejbName: MyTopicMDB03 19:07:28,890 INFO [EJB3Deployer] Deployed: file:/D:/DevelopTool/jboss-4.2.2.GA/server/default/deploy/MDBdemo.jar/ 19:07:34,875 INFO [STDOUT] my topic mdb 01 被调用 hello persia! 19:07:34,875 INFO [STDOUT] my topic mdb 03 被调用 hello persia! 19:07:34,875 INFO [STDOUT] my topic mdb 02 被调用 hello persia!
这是与点到点方式不同的地方,点到点只允许一个消息被接收。