與Queue不同的是,Topic實現的是發佈/訂閱模型,
在一個基於發佈/訂閱模型的應用或者產品中,客戶端根據主題來訂閱消息,有點像公告牌。發佈者和訂閱者一般都是匿名的,而且可以動態的發佈或者訂閱內容。消息系統會謹慎處理消息的分發到訂閱了某個主題的所有訂閱者,消息只會發送給當前訂閱者,然後就失效,新的訂閱者無法接收到剛剛失效的消息。
發佈和訂閱的消息機制具有以下特徵:
1)每個消息可以有多個消費者
2)發佈者和訂閱者是有時間依賴,只有當前訂閱了某個主題的訂閱者才能收到消息,訂閱者必須保持活躍以獲取消息
3)當一個消息可能會有多於1個的接收者是,請使用發佈/訂閱消息機制。
在下面的例子中,啓動2個消費者共同監聽一個Topic,然後循環給這個Topic中發送多個消息。
具體的代碼如下:
- /**
- * @author Administrator
- * @description 與Queue不同的是,Topic實現的是發佈/訂閱模型,在下面的例子中,啓動2個消費者共同監聽一個Topic,然後循環給這個Topic中發送多個消息
- * 結果表明:說明每一個消息都會被所有的消費者消費
- */
- package com.wl.jms;
- import javax.jms.Connection;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.MessageConsumer;
- import javax.jms.MessageListener;
- import javax.jms.MessageProducer;
- import javax.jms.Session;
- import javax.jms.TextMessage;
- import javax.jms.Topic;
- import org.apache.activemq.ActiveMQConnectionFactory;
- import org.apache.activemq.command.ActiveMQTopic;
- public class TopicTest {
- /**
- * @param args
- * @throws JMSException
- */
- public static void main(String[] args) throws JMSException {
- // TODO Auto-generated method stub
- ActiveMQConnectionFactory factory=new ActiveMQConnectionFactory("tcp://localhost:61616");
- Connection connection=factory.createConnection();
- connection.start();
- //創建一個Topic
- Topic topic=new ActiveMQTopic("testTopic");
- Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- //註冊消費者1
- MessageConsumer consumer1=session.createConsumer(topic);
- consumer1.setMessageListener(new MessageListener(){
- public void onMessage(Message m) {
- try {
- System.out.println("Consumer1 get: "+((TextMessage)m).getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- });
- //註冊消費者2
- MessageConsumer consumer2=session.createConsumer(topic);
- consumer2.setMessageListener(new MessageListener(){
- public void onMessage(Message m) {
- try {
- System.out.println("Consumer2 get: "+((TextMessage)m).getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- });
- //創建一個生產者,然後發送多個消息。
- MessageProducer producer=session.createProducer(topic);
- for(int i=0;i<10;i++){
- producer.send(session.createTextMessage("Message:"+i));
- }
- }
- }