摘要:一隊(duì)列模式特點(diǎn)客戶端包括生產(chǎn)者和消費(fèi)者隊(duì)列中的消息只能被一個(gè)消費(fèi)者消費(fèi)消費(fèi)者可以隨時(shí)消費(fèi)隊(duì)列中的消息二創(chuàng)建過(guò)程創(chuàng)建連接創(chuàng)建會(huì)話通過(guò)來(lái)創(chuàng)建其它的將生產(chǎn)者和消費(fèi)者都會(huì)指向目標(biāo)生產(chǎn)者向目標(biāo)發(fā)送消息消費(fèi)者設(shè)置監(jiān)聽器,監(jiān)聽消息。
前言
此處的代碼只是簡(jiǎn)化理解,實(shí)際項(xiàng)目會(huì)結(jié)合Spring使用。
一、隊(duì)列模式特點(diǎn)客戶端包括生產(chǎn)者和消費(fèi)者
隊(duì)列中的消息只能被一個(gè)消費(fèi)者消費(fèi)
消費(fèi)者可以隨時(shí)消費(fèi)隊(duì)列中的消息
二、創(chuàng)建過(guò)程1.創(chuàng)建連接Connection
2.創(chuàng)建會(huì)話Session
3.通過(guò)Session來(lái)創(chuàng)建其它的(MessageProducer、MessageConsumer、Destination、TextMessage)
4.將生產(chǎn)者 MessageProducer 和消費(fèi)者 MessageConsumer 都會(huì)指向目標(biāo) Destination
5.生產(chǎn)者向目標(biāo)發(fā)送TextMessage消息send()
6.消費(fèi)者設(shè)置監(jiān)聽器,監(jiān)聽消息。
2. 生產(chǎn)者 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 queueName = "queue-test"; public static void main(String[] args) throws JMSException { //1.創(chuàng)建ConnectionFactory ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.創(chuàng)建Connection Connection connection = connectionFactory.createConnection(); //3.啟動(dòng)連接 connection.start(); //4.創(chuàng)建會(huì)話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.創(chuàng)建一個(gè)目標(biāo) Destination destination = session.createQueue(queueName); //6.創(chuàng)建一個(gè)生產(chǎn)者 MessageProducer producer = session.createProducer(destination); for (int i = 0; i < 10; i++) { //7.創(chuàng)建消息 TextMessage textMessage = session.createTextMessage("test" + i); //8.發(fā)布消息 producer.send(textMessage); System.out.println("發(fā)送消息"+textMessage.getText()); } //9.關(guān)閉連接 connection.close(); } }3. 消費(fèi)者 AppConsumer.java
消費(fèi)者的連接Connection是不能關(guān)閉的,因?yàn)橄⒌慕邮帐钱惒降?,?huì)導(dǎo)致消息不能被消費(fèi)。
public class AppConsumer { private static final String url = "tcp://127.0.0.1:61616"; private static final String queueName = "queue-test"; public static void main(String[] args) throws JMSException { //1. 創(chuàng)建ConnectionFactory ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2. 創(chuàng)建Connection Connection connection = connectionFactory.createConnection(); //3. 啟動(dòng)連接 connection.start(); //4. 創(chuàng)建會(huì)話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 創(chuàng)建一個(gè)目標(biāo) Destination destination = session.createQueue(queueName); //6. 創(chuàng)建一個(gè)消費(fèi)者 MessageConsumer consumer = session.createConsumer(destination); //7. 創(chuàng)建一個(gè)監(jiān)聽器 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { try { System.out.println("接收消息 = [" + ((TextMessage) message).getText() + "]"); } catch (JMSException e) { e.printStackTrace(); } } }); //8.關(guān)閉連接(消費(fèi)者的連接不允許關(guān)閉的,因?yàn)橄⒌慕邮帐钱惒降?,?huì)導(dǎo)致消息不能被消費(fèi)) //connection.close(); } }四、運(yùn)行查看 1. 運(yùn)行生產(chǎn)者 AppProducer
運(yùn)行AppProducer.java后會(huì)發(fā)現(xiàn)隊(duì)列中添加了10條消息,如下圖:
2. 開啟消費(fèi)者 AppConsumer運(yùn)行AppConsumer.java后會(huì)發(fā)現(xiàn)隊(duì)列中的10條消息被消費(fèi)了,如下圖:
3.開啟兩個(gè)消費(fèi)者后,運(yùn)行生產(chǎn)者會(huì)發(fā)現(xiàn)生產(chǎn)者發(fā)送的10個(gè)消息,被兩個(gè)消費(fèi)者平分了。
AppConsumer1
接收消息 = [test1] 接收消息 = [test3] 接收消息 = [test5] 接收消息 = [test7] 接收消息 = [test9]
AppConsumer2
接收消息 = [test0] 接收消息 = [test2] 接收消息 = [test4] 接收消息 = [test6] 接收消息 = [test8]五、隊(duì)列模式和主題模式的區(qū)別
是否需要提前訂閱
隊(duì)列模式:消費(fèi)者不需要提前訂閱也可以消費(fèi)消息
主題模式:只有提前進(jìn)行訂閱的消費(fèi)者才能成功消費(fèi)消息
多個(gè)消費(fèi)者如何分配消息
隊(duì)列模式:只能平均消費(fèi)消息,被別的消費(fèi)者消費(fèi)的消息不能重復(fù)被其他的消費(fèi)者消費(fèi)
主題模式:每個(gè)訂閱者都可以消費(fèi)主題模式中的每一條消息
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69209.html
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。這個(gè)時(shí)候,可以啟動(dòng)多臺(tái)積分系統(tǒng),來(lái)同時(shí)消費(fèi)這個(gè)消息中間件里面的登錄消息,達(dá)到橫向擴(kuò)展的作用。 時(shí)間:2017年07月22日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無(wú)學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
摘要:學(xué)習(xí)消息隊(duì)列的使用之前,我們先來(lái)搞清。是操作消息的接口。消息生產(chǎn)者由創(chuàng)建,并用于將消息發(fā)送到。接收消息打印結(jié)果這是接收到的消息消費(fèi)者啟動(dòng)。。。。 通過(guò)上一篇文章 《消息隊(duì)列深入解析》,我們已經(jīng)消息隊(duì)列是什么、使用消息隊(duì)列的好處以及常見消息隊(duì)列的簡(jiǎn)單介紹。 這一篇文章,主要帶大家詳細(xì)了解一下消息隊(duì)列ActiveMQ的使用。 學(xué)習(xí)消息隊(duì)列ActiveMQ的使用之前,我們先來(lái)搞清JMS。 J...
摘要:中間件的分類基于遠(yuǎn)程過(guò)程調(diào)用的中間件?;趯?duì)象請(qǐng)求代理的中間件。消息傳遞指的是程序之間通過(guò)在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過(guò)直接調(diào)用彼此來(lái)通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過(guò)程調(diào)用的技術(shù)。 一.中間件 1.1 什么是中間件? 由于業(yè)務(wù)、機(jī)構(gòu)和技術(shù)是不斷變化的,因此為其服務(wù)的軟件系統(tǒng)必須適應(yīng)這樣的變化。在合并、添加服務(wù)或擴(kuò)展可用服務(wù)之后,公司可能無(wú)力負(fù)擔(dān)重新創(chuàng)建信息系統(tǒng)所需的成本。正是在...
摘要:本文主要講述消息服務(wù)在中的使用。所以需要一個(gè)監(jiān)聽容器工廠的概念,即接口,它會(huì)引用上面創(chuàng)建好的與的連接工廠,由它來(lái)負(fù)責(zé)接收消息以及將消息分發(fā)給指定的監(jiān)聽器。為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog> 本文所有服務(wù)均采用doc...
摘要:安裝到官方網(wǎng)站下載最新的的安裝包,并解壓到本地目錄下,下載鏈接如下。修改消費(fèi)者使用配置消費(fèi)者監(jiān)聽的隊(duì)列,其中是接收到的消息收到的報(bào)文為接收到的消息重新執(zhí)行 安裝ActiveMQ 到Apache官方網(wǎng)站下載最新的ActiveMQ的安裝包,并解壓到本地目錄下,下載鏈接如下:http://activemq.apache.org/do...。showImg(https://segmentfau...
閱讀 2680·2023-04-25 18:10
閱讀 1619·2019-08-30 15:53
閱讀 2817·2019-08-30 13:10
閱讀 3231·2019-08-29 18:40
閱讀 1137·2019-08-23 18:31
閱讀 1210·2019-08-23 16:49
閱讀 3410·2019-08-23 16:07
閱讀 885·2019-08-23 15:27