轉載請註明原文地址: http://www.javashuo.com/article/p-wqhrlhmn-et.htmlhtml
Java消息服務指的:兩個應用程序之間進行異步通訊的API,它爲標準消息協議和消息服務提供了一組通用接口,包括建立、發送、讀取消息等。java
當大併發時,業務邏輯沒法同時處理這麼多同時發生的請求,可是客戶端又不可能一直阻塞等待後臺處理完。所以就須要將 請求的送達 與 業務邏輯處理 解耦,「延時處理」。web
舉個例子:編程
電商平臺搞秒殺活動時,你們都爭先恐後地去搶同一件商品,其過程是:用戶發送購買請求後,服務器接到請求,向消息隊列發送一個購買消息並馬上返回「訂單正在處理」的結果給客戶避免客戶等待。服務器
而訂單服務[處理訂單的業務邏輯]則不停的從消息隊列中取出消息,按照本身的節奏去處理訂單,並將結果返回對應客戶端。session
這樣作能夠有效避免高併發時形成業務系統癱瘓的狀況。併發
JMS通常適用於Web場景下的高併發處理。異步
而對於ToB場景下,如企業ERP系統,則基本不會用到。微服務
由於ToC業務鏈條簡單,業務結果能夠容許輕微的延遲送達,不影響用戶的最終結果。高併發
而企業系統流程長,環環相扣,每一個環節都必須執行完才能走下一步業務,這種狀況下消息隊列的使用反而會形成業務混亂。
一、異步處理
二、可靠傳遞:JMS保證消息只會遞送一次。
一、點對點傳輸模型——適合於只有一個業務處理程序的場景
此模型由:消息發送者、消息隊列、消息接收者[處理者] 組成。
二、發佈訂閱 模型
此模型由 消息發送者、主題、多個訂閱者 組成。
topic主要用於保存和傳遞消息,且會一直保存消息直到消息被傳遞給客戶端。
爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的消息。
一、同步接收
消息訂閱者調用receive()方法。在receive()中,消息未到達或在到達指定時間以前,該方法會一直阻塞,直到有消息到來。
二、異步接收
消息訂閱者需註冊一個消息監聽者,相似於事件監聽器,只要消息到達,JMS服務提供者會經過調用監聽器的onMessage()來處理消息。
JMS提供了一系列消息服務的處理規範,由如下6部分組成:
JMS消息由三部分組成:
JMS消息頭預約義了若干字段用於客戶端與JMS提供者之間識別和發送消息,預編譯頭以下:
– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority
咱們能夠給消息設置自定義屬性,這些屬性主要是提供給應用程序的。對於實現消息過濾功能,消息屬性很是有用,JMS API定義了一些標準屬性,JMS服務提供者能夠選擇性的提供部分標準屬性。
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的兩種模型中提到,消息服務的場景主要包括:生產者、消費者、消息隊列、主題。
其中,消息生產者 和 消息消費者 分別是兩個微服務,一個負責接收請求生成消息,另外一個負責提取消息進行業務處理。
而中間做爲消息容器的 隊列、主題,則是由JMS的實現廠商提供的軟件實現,例如:ActiveMQ。
Activemq是一個軟件,一個消息服務器。咱們的程序做爲生產者和消費者,當ActiveMQ啓動起來,並配着好host以及相關協議後,便可在咱們的程序中,鏈接到該臺服務器,建立鏈接併發送/獲取消息了。
發送消息:
(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點對點消息傳送實現參考:http://www.javashuo.com/article/p-crgipmbt-db.html
JMS發佈/訂閱模型實現參考:http://www.javashuo.com/article/p-tldymjvc-kd.html
點對點傳送 與 發佈/訂閱模式 的實現區別:
點對點經過session建立隊列,而發佈/訂閱模式建立主題。