天天看點

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

閱讀目錄

什麼是Java消息服務 

為什麼需要JMS

JMS的優勢

JMS消息傳送模型

接收消息

JMS程式設計接口

JMS消息結構

JMS使用示例

Java消息服務指的是兩個應用程式之間進行異步通信的API,它為标準消息協定和消息服務提供了一組通用接口,包括建立、發送、讀取消息等,用于支援JAVA應用程式開發。

在J2EE中,當兩個應用程式使用JMS進行通信時,它們之間并不是直接相連的,而是通過一個共同的消息收發服務連接配接起來,可以達到解耦的效果,我們将會在接下來的教程中詳細介紹。

  在JAVA中,如果兩個應用程式之間對各自都不了解,甚至這兩個程式可能部署在不同的大洲上,那麼它們之間如何發送消息呢?舉個例子,一個應用程式A部署在印度,另一個應用程式部署在美國,然後每當A觸發某件事後,B想從A擷取一些更新資訊。當然,也有可能不止一個B對A的更新資訊感興趣,可能會有N個類似B的應用程式想從A中擷取更新的資訊。

  在這種情況下,JAVA提供了最佳的解決方案-JMS,完美解決了上面讨論的問題。

  JMS同樣适用于基于事件的應用程式,如聊天服務,它需要一種釋出事件機制向所有與伺服器連接配接的用戶端發送消息。JMS與RMI不同,發送消息的時候,接收者不需要線上。伺服器發送了消息,然後就不管了;等到用戶端上線的時候,能保證接收到伺服器發送的消息。這是一個很強大的解決方案,能處理當今世界很多普遍問題。

  JMS天生就是異步的,用戶端擷取消息的時候,不需要主動發送請求,消息會自動發送給可用的用戶端。

  JMS保證消息隻會遞送一次。大家都遇到過重複建立消息問題,而JMS能幫你避免該問題。

在JMS API出現之前,大部分産品使用“點對點”和“釋出/訂閱”中的任一方式來進行消息通訊。JMS定義了這兩種消息發送模型的規範,它們互相獨立。

任何JMS的提供者可以實作其中的一種或兩種模型,這是它們自己的選擇。JMS規範提供了通用接口保證我們基于JMS API編寫的程式适用于任何一種模型。

  讓我們更加詳細的看下這兩種消息傳送模型:

在點對點消息傳送模型中,應用程式由消息隊列,發送者,接收者組成。

每一個消息發送給一個特殊的消息隊列,該隊列儲存了所有發送給它的消息(除了被接收者消費掉的和過期的消息)。點對點消息模型有一些特性,如下:

每個消息隻有一個接收者;

消息發送者和接收者并沒有時間依賴性;

當消息發送者發送消息的時候,無論接收者程式在不在運作,都能擷取到消息;

當接收者收到消息的時候,會發送确認收到通知(acknowledgement)。

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

  在釋出/訂閱消息模型中,釋出者釋出一個消息,該消息通過topic傳遞給所有的用戶端。在這種模型中,釋出者和訂閱者彼此不知道對方,是匿名的且可以動态釋出和訂閱topic。topic主要用于儲存和傳遞消息,且會一直儲存消息直到消息被傳遞給用戶端。

釋出/訂閱消息模型特性如下:

一個消息可以傳遞給多個訂閱者

釋出者和訂閱者有時間依賴性,隻有當用戶端建立訂閱後才能接受消息,且訂閱者需一直保持活動狀态以接收消息。

為了緩和這樣嚴格的時間相關性,JMS允許訂閱者建立一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運作),它也能接收到釋出者的消息。

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

  在JMS中,消息的接收可以使用以下兩種方式:

  使用同步方式接收消息的話,消息訂閱者調用receive()方法。在receive()中,消息未到達或在到達指定時間之前,方法會阻塞,直到消息可用。

  使用異步方式接收消息的話,消息訂閱者需注冊一個消息監聽者,類似于事件監聽器,隻要消息到達,JMS服務提供者會通過調用監聽器的onMessage()遞送消息。

  JMS應用程式由如下基本子產品組成:

管理對象(Administered objects)-連接配接工廠(Connection Factories)和目的地(Destination)

連接配接對象(Connections)

會話(Sessions)

消息生産者(Message Producers)

消息消費者(Message Consumers)

消息監聽者(Message Listeners)

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

管理對象(Administered objects)是預先配置的JMS對象,由系統管理者為使用JMS的用戶端建立,主要有兩個被管理的對象:

連接配接工廠(ConnectionFactory)

目的地(Destination)

這兩個管理對象由JMS系統管理者通過使用Application Server管理控制台建立,存儲在應用程式伺服器的JNDI名字空間或JNDI系統資料庫。

用戶端使用一個連接配接工廠對象連接配接到JMS服務提供者,它建立了JMS服務提供者和用戶端之間的連接配接。JMS用戶端(如發送者或接受者)會在JNDI名字空間中搜尋并擷取該連接配接。使用該連接配接,用戶端能夠與目的地通訊,往隊列或話題發送/接收消息。讓我們用一個例子來了解如何發送消息:

目的地指明消息被發送的目的地以及用戶端接收消息的來源。JMS使用兩種目的地,隊列和話題。如下代碼指定了一個隊列和話題。

建立一個隊列Session

建立一個話題Session

連接配接對象封裝了與JMS提供者之間的虛拟連接配接,如果我們有一個ConnectionFactory對象,可以使用它來建立一個連接配接。

建立完連接配接後,需要在程式使用結束後關閉它:

Session是一個單線程上下文,用于生産和消費消息,可以建立出消息生産者和消息消費者。

Session對象實作了Session接口,在建立完連接配接後,我們可以使用它建立Session。

消息生産者由Session建立,用于往目的地發送消息。生産者實作MessageProducer接口,我們可以為目的地、隊列或話題建立生産者;

建立完消息生産者後,可以使用send方法發送消息:

消息消費者由Session建立,用于接受目的地發送的消息。消費者實作MessageConsumer接口,,我們可以為目的地、隊列或話題建立消費者;

JMS消息監聽器是消息的預設事件處理者,他實作了MessageListener接口,該接口包含一個onMessage方法,在該方法中需要定義消息達到後的具體動作。通過調用setMessageListener方法我們給指定消費者定義了消息監聽器

JMS用戶端使用JMS消息與系統通訊,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,表示鍵值對。

==================

前言

什麼是JNDI

使用Tomcat配置JNDI

啟動ActiveMQ

編寫一個Web工程

驗證結果

參考資料

  寫了一個簡單的JMS例子,之是以使用JNDI 是出于通用性考慮,該例子使用JMS規範提供的通用接口,沒有使用具體JMS提供者的接口,這樣可以保證我們編寫的程式适用于任何一種JMS實作(ActiveMQ、HornetQ...)。

  JNDI(Java Naming and Directory Interface)是一個标準規範,類似于JDBC,JMS等規範,為開發人員提供了查找和通路各種命名和目錄服務的通用、統一的接口。J2EE 規範要求所有 J2EE 容器都要提供 JNDI 規範的實作,是以Tomcat就實作了JNDI 規範。

  找到Tomcat安裝路徑下的conf檔案夾,打開context.xml,添加如下配置:

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

  CMD到ActiveMQ安裝路徑下的bin目錄,輸入“activemq start”指令即可啟動,可在浏覽器中輸入位址http://localhost:8161/admin,檢視隊列、話題等資訊。

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

  eclipse上建立web工程,添加ActiveMQ依賴的jar包,然後開始編寫兩個Servlet,一個用于生産消息,另一個用于消費消息,如下代碼:

消息生産者Servlet:

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

消息消費者Servlet:

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

  在Tomcat裡運作該Web工程,執行消息生産者Servlet,傳回消息發送成功标志,同時我們可以在http://localhost:8161/admin/queues.jsp檢視到該消息,如下圖所示

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

  繼續執行消息消費者Servlet,傳回消息接收成功标志,同時我們可以打開http://localhost:8161/admin/queues.jsp頁面,發現剛才的消息已經不見了,如下圖所示

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

=============================

JMS釋出/訂閱消息傳送例子

在Tomcat中配置JNDI

在Web工廠中編寫代碼

配置連接配接工廠和話題

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

建立一個釋出者Servlet

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

建立一個訂閱者Servlet

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

運作Web工程,分别打開多個标簽通路訂閱servlet,然後通路釋出servlet,結果如下:

測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)
測試開發進階——常用中間件概念——JMS(Java消息服務)入門&基于Tomcat + JNDI + ActiveMQ實作JMS的點對點消息傳送了解(轉載)

在訂閱者訂閱消息的時候,一開始沒接收到消息,一旦釋出者釋出消息後,訂閱者馬上收到消息。

=========================================================