ActiveMQ初級教程
MQ的思想其實和連線池差不多,只不過一個是佇列,一個是多執行緒。設計模式和原理都類似,ActiveMQ(以下簡稱amq)實際上是封裝了JMS,所以可以在amq裡直接使用很多JMS的物件。
去官網去下載 關於amq的安裝 so easy 我就不多說了 網上一搜一堆 需要注意的是下載的時候可能會有各種404問題 官網提供了很多的下載URL 國內的網路河蟹 很難下載 你可以換一個其他版本試試 (我就是這樣的)
JMS裡分為生產者(Producer)和消費者(Consumer)
生產者向佇列add data
消費者向佇列poll data
我來簡單介紹幾個MQ重要的物件
ActiveMQConnectionFactory : 實現了jms的ConnectionFactory,Connection的工廠類
Connection :JMS連線,和Java連線池的Connection差不多 Producer和Consumer用來和Broker通訊的
Session : 會話
Destination :目的地,資料要傳送到哪裡或者從哪裡取
MessageProducer: 生產者
MessageConsumer :消費者
Message : 訊息,add到佇列的東西,也就是自己要處理的東西,Message有很多子介面,TextMessage或ByteMessage神馬的 自己根據自己的業務選擇介面
以上除了ActiveMQConnectionFactory 是amq的類(實現JMS) 其他的基本都是JMS自己的介面 所以我們在程式碼裡直接使用的介面 因為除了ActiveMQConnectionFactory需要我們建立 其他的物件都不需要我們手動去建立
Producer
Consumer 下面就不寫註釋了 和上面一樣
有幾個地方要注意一下
1、ConnectionFactory的生命週期 此物件不要頻繁建立 全域性建立一個就好 每次用該物件獲取Connection就好了
1、DeliveryMode 持久化方式,開發中可以選擇對Message是否要做持久化,持久化的Message在重啟amq後還會依然存在,非持久化會自動被幹掉(但是會臨時存放於amp),
其值為NON_PERSISTENT非持久化 ,PERSISTENT持久化
2、ACK(Acknowledgement),先說下什麼是ACK,ACK即確認字元,在資料通訊中,接收站發給傳送站的一種傳輸類控制字元。表示發來的資料已確認接受無誤。ACK訊號通常是一個ASCII字元,不同的協議中ACK訊號都不一樣。
當Consumer拿到Message之後要通知Broker已確認接收,否則其他Consumer會認為該Message依然可用,JMS的Session中提供了四種ACK_MODE
AUTO_ACKNOWLEDGE = 1 自動確認
CLIENT_ACKNOWLEDGE = 2 客戶端手動確認
DUPS_OK_ACKNOWLEDGE = 3 自動批量確認
SESSION_TRANSACTED = 0 事務提交併確認
AcitveMQ對此補充了一個自定義的ACK_MODE: INDIVIDUAL_ACKNOWLEDGE = 4 單條訊息確認
去官網去下載 關於amq的安裝 so easy 我就不多說了 網上一搜一堆 需要注意的是下載的時候可能會有各種404問題 官網提供了很多的下載URL 國內的網路河蟹 很難下載 你可以換一個其他版本試試 (我就是這樣的)
JMS裡分為生產者(Producer)和消費者(Consumer)
生產者向佇列add data
消費者向佇列poll data
我來簡單介紹幾個MQ重要的物件
ActiveMQConnectionFactory : 實現了jms的ConnectionFactory,Connection的工廠類
Connection :JMS連線,和Java連線池的Connection差不多 Producer和Consumer用來和Broker通訊的
Session : 會話
Destination :目的地,資料要傳送到哪裡或者從哪裡取
MessageProducer: 生產者
MessageConsumer :消費者
Message : 訊息,add到佇列的東西,也就是自己要處理的東西,Message有很多子介面,TextMessage或ByteMessage神馬的 自己根據自己的業務選擇介面
以上除了ActiveMQConnectionFactory 是amq的類(實現JMS) 其他的基本都是JMS自己的介面 所以我們在程式碼裡直接使用的介面 因為除了ActiveMQConnectionFactory需要我們建立 其他的物件都不需要我們手動去建立
Producer
ConnectionFactory factory; //連線工廠
Connection connection;//jms連線
Session session;//傳送、接收執行緒
Destination destination;//訊息目的地
MessageProducer producer;//訊息傳送者
factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616"); //獲取工廠例項
/**
* 以上步驟可使用單例模式等方法,讓ActiveMQConnectionFactory始終只建立一次(和SessionFactory的性質差不多)
*/
try {
connection = factory.createConnection(); //獲取Connection
connection.start(); //開啟Connection
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); //建立Session並選擇事務和ACK模式
destination = session.createQueue("rdp_import_queue"); //根據自己的佇列名稱建立Destination(如果沒有佇列,MQ會自己建立佇列)
producer = session.createProducer(destination); //建立生產者
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //是否為持久化 ,NON_PERSISTENT非持久化 ,PERSISTENT持久化
for (int i = 1; i < 13; i++) {
String msg = "第" + i + "次傳送訊息";
TextMessage textMessage = session.createTextMessage(msg);
producer.send(textMessage);
}
//關閉物件
producer.close();
session.commit();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
Consumer 下面就不寫註釋了 和上面一樣
connection = factory.createConnection();
connection.start();
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("rdp_import_queue");
consumer = session.createConsumer(destination); // 建立Consumer
while (true) {
TextMessage textMessage = (TextMessage) consumer.receive(); // 接收Message
if (textMessage != null && !textMessage.getJMSRedelivered()) { //檢查是否已經接收過
System.out.println(textMessage.getText());
textMessage.acknowledge(); //通知已接收
}
Thread.sleep(1000);
}
有幾個地方要注意一下
1、ConnectionFactory的生命週期 此物件不要頻繁建立 全域性建立一個就好 每次用該物件獲取Connection就好了
1、DeliveryMode 持久化方式,開發中可以選擇對Message是否要做持久化,持久化的Message在重啟amq後還會依然存在,非持久化會自動被幹掉(但是會臨時存放於amp),
其值為NON_PERSISTENT非持久化 ,PERSISTENT持久化
2、ACK(Acknowledgement),先說下什麼是ACK,ACK即確認字元,在資料通訊中,接收站發給傳送站的一種傳輸類控制字元。表示發來的資料已確認接受無誤。ACK訊號通常是一個ASCII字元,不同的協議中ACK訊號都不一樣。
當Consumer拿到Message之後要通知Broker已確認接收,否則其他Consumer會認為該Message依然可用,JMS的Session中提供了四種ACK_MODE
AUTO_ACKNOWLEDGE = 1 自動確認
CLIENT_ACKNOWLEDGE = 2 客戶端手動確認
DUPS_OK_ACKNOWLEDGE = 3 自動批量確認
SESSION_TRANSACTED = 0 事務提交併確認
AcitveMQ對此補充了一個自定義的ACK_MODE: INDIVIDUAL_ACKNOWLEDGE = 4 單條訊息確認
相關文章
- yii2 開發 API 初級教程API
- 運維初級實踐——Linux系統命令教程運維Linux
- IOS 初級開發入門教程(一)介紹篇iOS
- 2019 壓題會計初級職稱考試教程
- 《熬夜整理》保姆級系列教程-玩轉Wireshark抓包神器教程(1)-初識Wireshark
- 寫給後端的Hadoop初級入門教程:概念篇後端Hadoop
- ActiveMQMQ
- 大資料教程系列之Kafka和activemq對比大資料KafkaMQ
- [譯] 用 Python 實現馬爾可夫鏈的初級教程Python馬爾可夫
- 安卓初級開發教程 ppt+視訊+案例原始碼安卓原始碼
- 寫給後端的Nginx初級入門教程:Nginx原理初探後端Nginx
- 寫給後端的Nginx初級入門教程:基礎篇後端Nginx
- LINUX初級命令Linux
- 初級掃雷
- Principle 高請視訊教程入門初級試學視訊教程免費下載
- 初學者Mybatis的初級使用MyBatis
- 寫給後端的Hadoop初級入門教程:Hadoop組成部分。後端Hadoop
- grafana初級入門Grafana
- 初級演算法演算法
- 寫給後端的Nginx初級入門教程:配置高可用叢集後端Nginx
- ActiveMq整合SpringMQSpring
- ActiveMQ嵌入TomcatMQTomcat
- ActiveMQ之StompMQ
- ActiveMQ入門MQ
- 2021年電工(初級)考試題及電工(初級)找答案
- IOS 初級開發入門教程(二)第一個HelloWorld工程及StoryBoard使用iOS
- 初級演算法-樹演算法
- PHP 初級 試崗要求PHP
- 動態規劃初級動態規劃
- 學習Grafana初級使用Grafana
- 初級資料結構資料結構
- LeetCode初級-反轉字串LeetCode字串
- 資料結構(初級)資料結構
- 初級Vue以及基本指令Vue
- 2020年焊工(初級)考試試題及焊工(初級)考試軟體
- 2020年茶藝師(初級)找答案及茶藝師(初級)多少錢
- 2020年焊工(初級)考試報名及焊工(初級)模擬考試
- 2020年電工(初級)多少分及格及電工(初級)證考試
- WinRAR初級中級高階等應用