Java1.8之JMS基礎學習

消息中間件

關注與消息的發送和接收,利用高效可靠的異步消息傳遞機制,集成分佈式系統的軟件。java

JSM概念

JMS(JAVA Message Service) java消息服務, 是一個java平臺中關於面向消息中間件的API, 用於在兩個應用程序之間或分佈式系統中發送消息, 進行異步通訊。注:它僅僅是一種規範。
JMS 容許應用程序組件基於JavaEE平臺建立、發送、接收和讀取消息。它使分佈式通訊耦合度更低,消息服務更加可靠以及異步性。在J2EE架構模式中,有消息服務者模式,用於實現消息與應用直接的解耦。服務器

JMS優點

JMS天生就是異步的,客戶端獲取消息的時候,不須要主動發送請求,消息會自動發送給可用的客戶端。
JMS保證消息只會遞送一次。你們都遇到太重複建立消息問題,而JMS能幫你避免該問題。架構

JMS相關概念

提供者:實現JMS規範的消息中間件服務器。
客戶端:發送或接收消息的應用程序。
生產者/發佈者:建立併發送消息的客戶端。
消費者/訂閱者:接收並處理消息的客戶端。
消息:應用程序之間傳遞的數據內容。
消息模式:在客戶端之間傳遞消息的方式,JMS中定義了主題和隊列兩種模式。併發

JMS編碼接口

ConnectionFactory:用於建立鏈接到消息中間件的鏈接工廠。
Connection:表明了應用程序和消息服務器之間的通訊鏈路。
Destination:指消息發佈和接收的地點,包括隊列或主題。
Session:表示一個單線程的上下文,用於發送和接收消息。
MessageConsumer:由會話建立,用於接收發送到目標的消息。
MessageProducer:由會話建立,用於發送消息到目標。
Message:是在消費者和生產者之間傳送的對象,消息頭,一組消息屬性,一個消息體。異步

接口的關係如圖:工廠建立一個鏈接,鏈接建立一個會話,會話中包含消息,會話建立發送者和接收者。
分佈式

JMS消息傳遞模型

消息模型:在JMS標準中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。編碼

P2P模式:
線程

P2P模式包含三個角色:消息隊列(Queue),發送者(Sender),接收者(Receiver)。每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,直到他們被消費或超時。中間件

P2P的特色:
每一個消息只有一個消費者(Consumer)(即一旦被消費,消息就再也不在消息隊列中)。
發送者和接收者之間在時間上沒有依賴性,當發送者發送了消息以後,無論接收者有沒有正在運行,它不會影響到消息被髮送到隊列。
接收者在成功接收消息以後需向隊列應答成功 ,若是但願發送的每一個消息都會被成功處理的話,那麼須要P2P模式。對象

Pub/Sub模式:

包含主題(Topic),發佈者(Publisher),訂閱者(Subscriber),多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。

Pub/Sub的特色:
每一個消息能夠有多個消費者。
發佈者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者以後,才能消費發佈者的消息。
爲了消費消息,訂閱者必須保持運行的狀態。爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的消息。
若是但願發送的消息能夠不被作任何處理、或者只被一個消息者處理、或者能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模型。

消息消費

在JMS中,消息的產生和消費都是異步的。對於消費來講,JMS的消息者能夠經過兩種方式來消費消息。

同步
訂閱者或接收者經過receive方法來接收消息,receive方法在接收到消息以前(或超時以前)將一直阻塞;
異步
訂閱者或接收者能夠註冊爲一個消息監聽器。當消息到達以後,系統自動調用監聽器的onMessage方法。

消息頭

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消息監聽器是消息的默認事件處理者,他實現了MessageListener接口,該接口包含一個onMessage方法,在該方法中須要定義消息達到後的具體動做。經過調用setMessageListener方法咱們給指定消費者定義了消息監聽器。

JMS提供者

要使用Java消息服務,你必需要有一個JMS提供者,管理會話和隊列。如今既有開源的提供者也有專有的提供者。 開源的提供者包括:ActiveMQ、Kafka、WebMethods、阿里的RocketMQ等。

相關文章
相關標籤/搜索