JMS入门(四)--Topic的使用

与Queue不同的是,Topic实现的是发布/订阅模型,


在一个基于发布/订阅模型的应用或者产品中,客户端根据主题来订阅消息,有点像公告牌。发布者和订阅者一般都是匿名的,而且可以动态的发布或者订阅内容。消息系统会谨慎处理消息的分发到订阅了某个主题的所有订阅者,消息只会发送给当前订阅者,然后就失效,新的订阅者无法接收到刚刚失效的消息。

发布和订阅的消息机制具有以下特征:

1)每个消息可以有多个消费者

2)发布者和订阅者是有时间依赖,只有当前订阅了某个主题的订阅者才能收到消息,订阅者必须保持活跃以获取消息

3)当一个消息可能会有多于1个的接收者是,请使用发布/订阅消息机制。

在下面的例子中,启动2个消费者共同监听一个Topic,然后循环给这个Topic中发送多个消息。

具体的代码如下:

[java] view plaincopy
  1. /** 
  2.  * @author Administrator 
  3.  * @description 与Queue不同的是,Topic实现的是发布/订阅模型,在下面的例子中,启动2个消费者共同监听一个Topic,然后循环给这个Topic中发送多个消息 
  4.  * 结果表明:说明每一个消息都会被所有的消费者消费 
  5.  */  
  6. package com.wl.jms;  
  7.   
  8. import javax.jms.Connection;  
  9. import javax.jms.JMSException;  
  10. import javax.jms.Message;  
  11. import javax.jms.MessageConsumer;  
  12. import javax.jms.MessageListener;  
  13. import javax.jms.MessageProducer;  
  14. import javax.jms.Session;  
  15. import javax.jms.TextMessage;  
  16. import javax.jms.Topic;  
  17.   
  18. import org.apache.activemq.ActiveMQConnectionFactory;  
  19. import org.apache.activemq.command.ActiveMQTopic;  
  20.   
  21. public class TopicTest {  
  22.   
  23.     /** 
  24.      * @param args 
  25.      * @throws JMSException  
  26.      */  
  27.     public static void main(String[] args) throws JMSException {  
  28.         // TODO Auto-generated method stub  
  29.         ActiveMQConnectionFactory factory=new ActiveMQConnectionFactory("vm://localhost");  
  30.         Connection connection=factory.createConnection();  
  31.         connection.start();  
  32.         //创建一个Topic  
  33.         Topic topic=new ActiveMQTopic("testTopic");  
  34.         Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  35.         //注册消费者1  
  36.         MessageConsumer consumer1=session.createConsumer(topic);  
  37.         consumer1.setMessageListener(new MessageListener(){  
  38.             public void onMessage(Message m) {  
  39.                 try {  
  40.                     System.out.println("Consumer1 get: "+((TextMessage)m).getText());  
  41.                 } catch (JMSException e) {  
  42.                     e.printStackTrace();  
  43.                 }  
  44.             }  
  45.               
  46.         });  
  47.         //注册消费者2  
  48.         MessageConsumer consumer2=session.createConsumer(topic);  
  49.         consumer2.setMessageListener(new MessageListener(){  
  50.             public void onMessage(Message m) {  
  51.                 try {  
  52.                     System.out.println("Consumer2 get: "+((TextMessage)m).getText());  
  53.                 } catch (JMSException e) {  
  54.                     e.printStackTrace();  
  55.                 }  
  56.             }  
  57.               
  58.         });  
  59.         //创建一个生产者,然后发送多个消息。  
  60.         MessageProducer producer=session.createProducer(topic);  
  61.         for(int i=0;i<10;i++){  
  62.             producer.send(session.createTextMessage("Message:"+i));  
  63.         }  
  64.     }  
  65.   
  66. }  
运行结果如下:


结果表明:说明每一个消息都会被所有的消费者消费
展开阅读全文

没有更多推荐了,返回首页