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

與Queue不同的是,Topic實現的是發佈/訂閱模型,


在一個基於發佈/訂閱模型的應用或者產品中,客戶端根據主題來訂閱消息,有點像公告牌。發佈者和訂閱者一般都是匿名的,而且可以動態的發佈或者訂閱內容。消息系統會謹慎處理消息的分發到訂閱了某個主題的所有訂閱者,消息只會發送給當前訂閱者,然後就失效,新的訂閱者無法接收到剛剛失效的消息。

發佈和訂閱的消息機制具有以下特徵:

1)每個消息可以有多個消費者

2)發佈者和訂閱者是有時間依賴,只有當前訂閱了某個主題的訂閱者才能收到消息,訂閱者必須保持活躍以獲取消息

3)當一個消息可能會有多於1個的接收者是,請使用發佈/訂閱消息機制。

在下面的例子中,啓動2個消費者共同監聽一個Topic,然後循環給這個Topic中發送多個消息。

具體的代碼如下:

[java] view plain copy
  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("tcp://localhost:61616");  
  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. }  
運行結果如下:


結果表明:說明每一個消息都會被所有的消費者消費
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章