轉載請注明原文地址: https://www.cnblogs.com/ygj0930/p/10921569.html
一:什么是Java消息服務—— 消息通信接口規范
Java消息服務指的:兩個應用程序之間進行異步通信的API,它為標准消息協議和消息服務提供了一組通用接口,包括創建、發送、讀取消息等。
二:為什么要用JMS
當大並發時,業務邏輯無法同時處理這么多同時發生的請求,但是客戶端又不可能一直阻塞等待后台處理完。因此就需要將 請求的送達 與 業務邏輯處理 解耦,“延時處理”。
舉個例子:
電商平台搞秒殺活動時,大家都爭先恐后地去搶同一件商品,其過程是:用戶發送購買請求后,服務器接到請求,向消息隊列發送一個購買消息並立刻返回“訂單正在處理”的結果給客戶避免客戶等待。
而訂單服務[處理訂單的業務邏輯]則不停的從消息隊列中取出消息,按照自己的節奏去處理訂單,並將結果返回對應客戶端。
這樣做可以有效避免高並發時造成業務系統癱瘓的情況。
三:JMS的使用場景
JMS一般適用於Web場景下的高並發處理。
而對於ToB場景下,如企業ERP系統,則基本不會用到。
因為ToC業務鏈條簡單,業務結果可以允許輕微的延遲送達,不影響用戶的最終結果。
而企業系統流程長,環環相扣,每個環節都必須執行完才能走下一步業務,這種情況下消息隊列的使用反而會造成業務混亂。
四:JMS的優勢
1、異步處理
2、可靠傳遞:JMS保證消息只會遞送一次。
五:JMS消息傳送模型
1、點對點傳輸模型——適合於只有一個業務處理程序的場景
此模型由:消息發送者、消息隊列、消息接收者[處理者] 組成。
- 每個消息只有一個接收者;
- 消息發送者和接收者並沒有時間依賴性,互不可見。
- 當消息發送者發送消息的時候,無論接收者程序在不在運行,都能獲取到消息;
- 當接收者收到消息的時候,會發送確認收到通知(acknowledgement)。
2、發布訂閱 模型
此模型由 消息發送者、主題、多個訂閱者 組成。
topic主要用於保存和傳遞消息,且會一直保存消息直到消息被傳遞給客戶端。
- 一個消息可以傳遞給多個訂閱者
- 發布者和訂閱者有時間依賴性,只有當客戶端創建訂閱后才能接受消息,且訂閱者需一直保持活動狀態以接收消息。
-
為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。
六:JMS消息接收方式
1、同步接收
消息訂閱者調用receive()方法。在receive()中,消息未到達或在到達指定時間之前,該方法會一直阻塞,直到有消息到來。
2、異步接收
消息訂閱者需注冊一個消息監聽者,類似於事件監聽器,只要消息到達,JMS服務提供者會通過調用監聽器的onMessage()來處理消息。
七:JMS編程接口組成
JMS提供了一系列消息服務的處理規范,由以下6部分組成:
- 連接工廠(Connection Factories)和目的地(Destination)
- 連接(Connections)
- 會話(Sessions)
- 消息生產者(Message Producers)
- 消息消費者(Message Consumers)
- 消息監聽者(Message Listeners)
八:JMS的消息組成
JMS消息由三部分組成:
1、消息頭——用於匹配
JMS消息頭預定義了若干字段用於客戶端與JMS提供者之間識別和發送消息,預編譯頭如下:
– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority
2、消息屬性
我們可以給消息設置自定義屬性,這些屬性主要是提供給應用程序的。對於實現消息過濾功能,消息屬性非常有用,JMS API定義了一些標准屬性,JMS服務提供者可以選擇性的提供部分標准屬性。
3、消息體
JMS API定義了五種類型的消息格式:
Text message : javax.jms.TextMessage,表示一個文本對象。
Object message : javax.jms.ObjectMessage,表示一個JAVA對象。
Bytes message : javax.jms.BytesMessage,表示字節數據。
Stream message :javax.jms.StreamMessage,表示java原始值數據流。
Map message : javax.jms.MapMessage,表示鍵值對。
九:JMS的實現——ActiveMQ
上面JMS的兩種模型中提到,消息服務的場景主要包括:生產者、消費者、消息隊列、主題。
其中,消息生產者 和 消息消費者 分別是兩個微服務,一個負責接收請求生成消息,另一個負責提取消息進行業務處理。
而中間作為消息容器的 隊列、主題,則是由JMS的實現廠商提供的軟件實現,例如:ActiveMQ。
Activemq是一個軟件,一個消息服務器。我們的程序作為生產者和消費者,當ActiveMQ啟動起來,並配着好host以及相關協議后,即可在我們的程序中,連接到該台服務器,創建連接並發送/獲取消息了。
十:JMS編程步驟
發送消息:
(1)、創建連接使用的工廠類JMS ConnectionFactory
(2)、使用管理對象JMS ConnectionFactory建立連接Connection,並啟動
(3)、使用連接Connection 建立會話Session
(4)、使用會話Session和管理對象Destination創建消息生產者MessageSender
(5)、使用消息生產者MessageSender發送消息
接受消息:
(1)、創建連接使用的工廠類JMS ConnectionFactory
(2)、使用管理對象JMS ConnectionFactory建立連接Connection,並啟動
(3)、使用連接Connection 建立會話Session
(4)、使用會話Session和管理對象Destination創建消息接收者MessageReceiver
(5)、使用消息接收者MessageReceiver接受消息,需要用setMessageListener將MessageListener接口綁定到MessageReceiver消息接收者必須實現了MessageListener接口,需要定義onMessage事件方法。
十一:實戰例子
JMS點對點消息傳送實現參考:https://www.cnblogs.com/chenpi/p/5565618.html
JMS發布/訂閱模型實現參考:https://www.cnblogs.com/chenpi/p/5566983.html
點對點傳送 與 發布/訂閱模式 的實現區別:
點對點通過session創建隊列,而發布/訂閱模式創建主題。