JMS規範
在初識消息中間件 中的消息中間件的編年史圖中,我們就瞭解到了JMS誕生於2001年,其本質是一套Java的API。
JMS(Java Messaging Service)是Java平臺上有關面向消息中間件的技術規範,它便於消息系統中的Java應用程序進行消息交換,並且通過提供標準的產生、發送、接收消息的接口簡化企業應用的開發,ActiveMQ則是這個規範的一個具體實現。
JMS對象模型
JMS規範模型包含如下幾個要素:
-
連接工廠
連接工廠負責創建一個JMS連接。 -
JMS連接
JMS連接(Connection)表示JMS客戶端和服務器端之間的一個活動的連接,是由客戶端通過調用連接工廠的方法建立的。 -
JMS會話
JMS會話(Session)表示JMS客戶與JMS服務器之間的會話狀態。JMS會話建立在JMS連接上,表示客戶與服務器之間的一個會話線程。 -
JMS目的/Broker
客戶用來指定它生產的消息的目標和它消費的消息的來源的對象,一個消息中間件的實例。 -
JMS生產者和消費者
生產者(Message Producer)和消費者(Message Consumer)對象由Session對象創建,用於發送和接收消息。
其中消息的消費可以採用以下兩種方法之一:同步消費
,通過調用 消費者的receive 方法從目的地中顯式提取消息。receive 方法可以一直阻塞到消息到達。異步消費
,客戶可以爲消費者註冊一個消息監聽器,以定義在消息到達時所採取的動作。
JMS規範中的消息
接下來再來看一看JMS規範中的消息,JMS 消息由以下三部分組成:
- 消息頭。每個消息頭字段都有相應的getter 和setter 方法。
- 消息屬性。如果需要除消息頭字段以外的值,那麼可以使用消息屬性。
- 消息體。JMS 定義的消息類型有 TextMessage、MapMessage、BytesMessage、StreamMessage 和 ObjectMessage。ActiveMQ也有對應的實現。
JMS消息模型
Point-to-Point(P2P) / 點對點
消息通過稱爲隊列的一個虛擬通道來進行交換。隊列是生產者發送消息的目的地和接受者消費消息的消息源。
每條消息通僅會傳送給一個接受者。可能會有多個接受者在一個隊列中偵聽,但是每個隊列中的消息只能被隊列中的一個接受者消費。
消息存在先後順序。一個隊列會按照消息服務器將消息放入隊列中的順序,把它們傳送給消費者當消息已被消費時,就會從隊列頭部將它們刪除。
每個消息只有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中) ,發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被髮送到隊列
接收者在成功接收消息之後需向隊列應答成功,如果希望發送的每個消息都應該被成功處理的話,使用這個P2P模式。
Topic/ 主題(發佈訂閱(Pub/Sub) )
消息生產者(發佈)將消息發佈到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不同,發佈到topic的消息會被所有訂閱者消費。
發送者在發送了消息之後,如果沒有接收者正在運行,那麼該消息就會丟失,如果你希望發送的消息可以不被做任何處理、或者被一個消息者處理、或者可以被多個消費者處理的話,那麼可以採用topic模型
ActiveMQ安裝、部署和運行
首先我們肯定需要去ActiveMQ的官網去下載一個安裝包,下載地址:http://activemq.apache.org/components/classic/download/ ,然後將其解壓
進入上圖中的bin目錄,然後運行bin目錄的win64文件夾下的activemq.bat即可。
Linux下操作類似(進入bin目錄運行./activemq start啓動,./activemq stop關閉)。
運行後在瀏覽器中訪問http://127.0.0.1:8161/admin
,即可看到ActiveMQ的管理控制檯(默認賬號密碼都是admin),ActiveMQ中,61616爲服務端口,8161爲管理控制檯端口。
至於我們在使用ActiveMQ時,默認的服務端口爲61616,一般沒有更改的必要,如果想要更改其端口號,可以在其安裝目錄的 conf 文件夾下的 activemq.xml 文件中進行修改
在其中我們就可以看到其端口號,然後可以對其進行修改。並且我們還發現ActiveMQ還支持很多其他的協議,比如我們比較熟悉的stomp及ws,基於Stomp的聊天工具 中就曾介紹過Stomp的用法,還包括了前端JS如何訪問,至於websocket我們也是同樣有過相關介紹的。
另外在訪問http://127.0.0.1:8161/admin
,登錄ActiveMQ的管理控制檯時,其默認的賬號密碼也是可以進行修改的