Java JMS——消息服務

 

轉載請註明原文地址: http://www.javashuo.com/article/p-wqhrlhmn-et.htmlhtml

 

一:什麼是Java消息服務—— 消息通訊接口規範

  Java消息服務指的:兩個應用程序之間進行異步通訊的API,它爲標準消息協議和消息服務提供了一組通用接口,包括建立、發送、讀取消息等。java

 

二:爲何要用JMS

  當大併發時,業務邏輯沒法同時處理這麼多同時發生的請求,可是客戶端又不可能一直阻塞等待後臺處理完。所以就須要將 請求的送達 與 業務邏輯處理 解耦,「延時處理」web

  舉個例子:編程

  電商平臺搞秒殺活動時,你們都爭先恐後地去搶同一件商品,其過程是:用戶發送購買請求後,服務器接到請求,向消息隊列發送一個購買消息並馬上返回「訂單正在處理」的結果給客戶避免客戶等待。服務器

  而訂單服務[處理訂單的業務邏輯]則不停的從消息隊列中取出消息,按照本身的節奏去處理訂單,並將結果返回對應客戶端。session

 

  這樣作能夠有效避免高併發時形成業務系統癱瘓的狀況。併發

 

三:JMS的使用場景

  JMS通常適用於Web場景下的高併發處理。異步

  而對於ToB場景下,如企業ERP系統,則基本不會用到。微服務

  由於ToC業務鏈條簡單,業務結果能夠容許輕微的延遲送達,不影響用戶的最終結果。高併發

  而企業系統流程長,環環相扣,每一個環節都必須執行完才能走下一步業務,這種狀況下消息隊列的使用反而會形成業務混亂。

 

四:JMS的優點

  一、異步處理

  二、可靠傳遞:JMS保證消息只會遞送一次。

 

五:JMS消息傳送模型

 一、點對點傳輸模型——適合於只有一個業務處理程序的場景

  

  此模型由:消息發送者、消息隊列、消息接收者[處理者] 組成。

  • 每一個消息只有一個接收者;
  • 消息發送者和接收者並無時間依賴性,互不可見。
  • 當消息發送者發送消息的時候,不管接收者程序在不在運行,都能獲取到消息;
  • 當接收者收到消息的時候,會發送確認收到通知(acknowledgement)。

     

  二、發佈訂閱 模型

  

  此模型由 消息發送者、主題、多個訂閱者 組成。

  topic主要用於保存和傳遞消息,且會一直保存消息直到消息被傳遞給客戶端。

  • 一個消息能夠傳遞給多個訂閱者
  • 發佈者和訂閱者有時間依賴性,只有當客戶端建立訂閱後才能接受消息,且訂閱者需一直保持活動狀態以接收消息。
  • 爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的消息。

 

六:JMS消息接收方式

  一、同步接收

  消息訂閱者調用receive()方法。在receive()中,消息未到達或在到達指定時間以前,該方法會一直阻塞,直到有消息到來。

 

  二、異步接收

  消息訂閱者需註冊一個消息監聽者,相似於事件監聽器,只要消息到達,JMS服務提供者會經過調用監聽器的onMessage()來處理消息。

 

七:JMS編程接口組成

  JMS提供了一系列消息服務的處理規範,由如下6部分組成:

  1. 鏈接工廠(Connection Factories)和目的地(Destination)
  2. 鏈接(Connections)
  3. 會話(Sessions)
  4. 消息生產者(Message Producers)
  5. 消息消費者(Message Consumers)
  6. 消息監聽者(Message Listeners)

 

八:JMS的消息組成

   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的實現——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點對點消息傳送實現參考:http://www.javashuo.com/article/p-crgipmbt-db.html

  JMS發佈/訂閱模型實現參考:http://www.javashuo.com/article/p-tldymjvc-kd.html

 

  點對點傳送 與 發佈/訂閱模式 的實現區別:

  點對點經過session建立隊列,而發佈/訂閱模式建立主題。

相關文章
相關標籤/搜索