摘要:主題模式又名發布訂閱者模式。先啟動兩個消費者,然后啟動生產者發布條消息,這時兩個消費者都可以消費服務器中的每一條消息。這就是主題模式的特點每個訂閱者都可以消費主題模式中的每一條消息。
主題模式 又名 發布訂閱者模式(Pub/Sub)。
一、主題模式特點客戶端包括發布者和訂閱者
主題中的消息被所有訂閱者消費
消費者不能消費訂閱之前就發送到主題中的消息
二、創建過程1.創建連接Connection
2.創建會話Session
3.通過Session來創建其它的(MessageProducer、MessageConsumer、Destination、TextMessage)
4.將生產者 MessageProducer 和消費者 MessageConsumer 都會指向目標 Destination
5.生產者向目標發送TextMessage消息send()
6.消費者設置監聽器,監聽消息。
相對于前一篇文章所講的隊列模式,主題模式只需要修改其中的createQueue()為createTopic();
1. 創建Maven項目2. 生產者 AppProducer.java4.0.0 com.jms jms-test 1.0-SNAPSHOT org.apache.activemq activemq-all 5.9.0
public class AppProducer { private static final String url = "tcp://127.0.0.1:61616"; private static final String topicName = "topic-test"; public static void main(String[] args) throws JMSException { //1.創建ConnectionFactory ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.創建Connection Connection connection = connectionFactory.createConnection(); //3.啟動連接 connection.start(); //4.創建會話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.創建一個目標 Destination destination = session.createTopic(topicName); //6.創建一個生產者 MessageProducer producer = session.createProducer(destination); for (int i = 0; i < 10; i++) { //7.創建消息 TextMessage textMessage = session.createTextMessage("test" + i); //8.發布消息 producer.send(textMessage); System.out.println("發送消息"+textMessage.getText()); } //9.關閉連接 connection.close(); } }3. 消費者 AppConsumer.java
public class AppConsumer { private static final String url = "tcp://127.0.0.1:61616"; private static final String topicName = "topic-test"; public static void main(String[] args) throws JMSException { //1. 創建ConnectionFactory ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2. 創建Connection Connection connection = connectionFactory.createConnection(); //3. 啟動連接 connection.start(); //4. 創建會話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 創建一個目標 Destination destination = session.createTopic(topicName); //6. 創建一個消費者 MessageConsumer consumer = session.createConsumer(destination); //7. 創建一個監聽器 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { try { System.out.println("接收消息 = [" + ((TextMessage) message).getText() + "]"); } catch (JMSException e) { e.printStackTrace(); } } }); //8.關閉連接 //connection.close(); } }四、運行查看 1. 先運行生產者 AppProducer
會發現有10條消息被發布
運行AppConsumer.java后會發現發布的10條消息并沒有被消費者接收,因為在主題模式中: 只有提前進行訂閱的消費者才能成功消費消息。而隊列模式中消費者不需要提前訂閱也可以消費消息。如下圖:
3.先開啟兩個消費者,后運行生產者會發現生產者發送的10個消息,兩個消費者都全部接收。
AppConsumer1
接收消息 = [test0] 接收消息 = [test1] 接收消息 = [test2] 接收消息 = [test3] 接收消息 = [test4] 接收消息 = [test5] 接收消息 = [test6] 接收消息 = [test7] 接收消息 = [test8] 接收消息 = [test9]
AppConsumer2
接收消息 = [test0] 接收消息 = [test1] 接收消息 = [test2] 接收消息 = [test3] 接收消息 = [test4] 接收消息 = [test5] 接收消息 = [test6] 接收消息 = [test7] 接收消息 = [test8] 接收消息 = [test9]4. 小結
先啟動生產者,發布10條消息,然后再啟動消費者,這時消費者是不能消費到消息的,因為主題模式中: 只有提前進行訂閱的消費者才能成功消費消息。而隊列模式消費者不需要提前訂閱也可以消費消息
先啟動一個消費者,然后再啟動生產者發布10條消息,這時消費者成功消費了ActiveMQ服務器中的消息。
先啟動兩個消費者,然后啟動生產者發布10條消息,這時兩個消費者都可以消費ActiveMQ服務器中的每一條消息。這就是主題模式的特點: 每個訂閱者都可以消費主題模式中的每一條消息。而隊列模式中,只能平均消費消息,被別的消費者消費的消息不能重復被其他的消費者消費
五、隊列模式和主題模式的區別是否需要提前訂閱
隊列模式:消費者不需要提前訂閱也可以消費消息
主題模式:只有提前進行訂閱的消費者才能成功消費消息
多個消費者如何分配消息
隊列模式:只能平均消費消息,被別的消費者消費的消息不能重復被其他的消費者消費
主題模式:每個訂閱者都可以消費主題模式中的每一條消息
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69197.html
摘要:時間年月日星期六說明本文部分內容均來自慕課網。這個時候,可以啟動多臺積分系統,來同時消費這個消息中間件里面的登錄消息,達到橫向擴展的作用。 時間:2017年07月22日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
摘要:學習消息隊列的使用之前,我們先來搞清。是操作消息的接口。消息生產者由創建,并用于將消息發送到。接收消息打印結果這是接收到的消息消費者啟動。。。。 通過上一篇文章 《消息隊列深入解析》,我們已經消息隊列是什么、使用消息隊列的好處以及常見消息隊列的簡單介紹。 這一篇文章,主要帶大家詳細了解一下消息隊列ActiveMQ的使用。 學習消息隊列ActiveMQ的使用之前,我們先來搞清JMS。 J...
摘要:中間件的分類基于遠程過程調用的中間件。基于對象請求代理的中間件。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用于諸如遠程過程調用的技術。 一.中間件 1.1 什么是中間件? 由于業務、機構和技術是不斷變化的,因此為其服務的軟件系統必須適應這樣的變化。在合并、添加服務或擴展可用服務之后,公司可能無力負擔重新創建信息系統所需的成本。正是在...
摘要:本文主要講述消息服務在中的使用。所以需要一個監聽容器工廠的概念,即接口,它會引用上面創建好的與的連接工廠,由它來負責接收消息以及將消息分發給指定的監聽器。為了消費消息,訂閱者必須保持運行的狀態。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創,歡迎轉載,轉載請保留出處:https://github.com/jasonGeng88/blog> 本文所有服務均采用doc...
閱讀 1995·2021-11-15 18:09
閱讀 889·2021-09-06 15:13
閱讀 2636·2021-08-23 09:43
閱讀 2016·2019-08-30 15:54
閱讀 2209·2019-08-30 13:56
閱讀 2476·2019-08-26 11:31
閱讀 3070·2019-08-26 10:56
閱讀 685·2019-08-26 10:28