ActiveMQ是Apache所提供的一個開源的消息系統,完全采用Java來實作,是以,它能很好地支援J2EE提出的JMS(Java Message Service,即Java消息服務)規範。JMS是一組Java應用程式接口,它提供消息的建立、發送、讀取等一系列服務。JMS提供了一組公共應用程式接口和響應的文法,類似于Java資料庫的統一通路接口JDBC,它是一種與廠商無關的API,使得Java程式能夠與不同廠商的消息元件很好地進行通信。
JMS支援兩種消息發送和接收模型。一種稱為P2P(Ponit to Point)模型,即采用點對點的方式發送消息。P2P模型是基于隊列的,消息生産者發送消息到隊列,消息消費者從隊列中接收消息,隊列的存在使得消息的異步傳輸稱為可能,P2P模型在點對點的情況下進行消息傳遞時采用。

另一種稱為Pub/Sub(Publish/Subscribe,即釋出-訂閱)模型,釋出-訂閱模型定義了如何向一個内容節點釋出和訂閱消息,這個内容節點稱為topic(主題)。主題可以認為是消息傳遞的中介,消息釋出這将消息釋出到某個主題,而消息訂閱者則從主題訂閱消息。主題使得消息的訂閱者與消息的釋出者互相保持獨立,不需要進行接觸即可保證消息的傳遞,釋出-訂閱模型在消息的一對多廣播時采用。
下載下傳之後解壓: tar -zvxf apache-activemq-5.13.2-bin.tar.gz
ActiveMQ目錄内容有:
bin目錄包含ActiveMQ的啟動腳本
conf目錄包含ActiveMQ的所有配置檔案
data目錄包含日志檔案和持久性消息資料
example: ActiveMQ的示例
lib: ActiveMQ運作所需要的lib
webapps: ActiveMQ的web控制台和一些相關的demo
運作指令:activemq start(在activemq/bin下運作)
檢視activemq是否運作指令:ps -aux | grep activemq
關閉指令: activemq stop
ActiveMQ的預設服務端口為61616,這個可以在conf/activemq.xml配置檔案中修改:
在下載下傳的apache-activemq-5.13.2-bin.tar.gz包中解壓有一個jar包:activemq-all-5.13.2.jar,引入這個jar到你的項目中即可開始編寫案例代碼。
部落客的activemq伺服器位址為10.10.195.187,這個在下面代碼中會有展現。
按照JMS的規範,我們首先需要獲得一個JMS connection factory.,通過這個connection factory來建立connection.在這個基礎之上我們再建立session, destination, producer和consumer。是以主要的幾個步驟如下:
獲得JMS connection factory. 通過我們提供特定環境的連接配接資訊來構造factory。
利用factory構造JMS connection
啟動connection
通過connection建立JMS session.
指定JMS destination.
建立JMS producer或者建立JMS message并提供destination.
建立JMS consumer或注冊JMS message listener.
發送和接收JMS message.
關閉所有JMS資源,包括connection, session, producer, consumer等。
下面來看代碼舉例(P2P式)。
通過Java實作的基于ActiveMQ的請求送出:
建立Session時有兩個非常重要的參數,第一個boolean類型的參數用來表示是否采用事務消息。如果是事務消息,對于的參數設定為true,此時消息的送出自動有comit處理,消息的復原則自動由rollback處理。加入消息不是事務的,則對應的該參數設定為false,此時分為三種情況:
Session.AUTO_ACKNOWLEDGE表示Session會自動确認所接收到的消息。
Session.CLIENT_ACKNOWLEDGE表示由用戶端程式通過調用消息的确認方法來确認所接收到的消息。
Session.DUPS_OK_ACKNOWLEDGE使得Session将“懶惰”地确認消息,即不會立即确認消息,這樣有可能導緻消息重複投遞。
提供Java實作的基于ActiveMQ的請求處理:
輸出結果:
這個是在jetty伺服器下跑的,可以修改conf/jetty.xml來修改相關jetty配置。
上面的例子是關于P2P模式的,不過有個不妥之處,就是沒有資源的釋放。下面舉一個Pub/Sub模式的。
通過JMS建立ActiveMQ的topic,并給topic發送消息:
消息發送到對應的topic後,需要将listener注冊到需要訂閱的topic上,以便能夠接收該topic的消息:
參考文獻
1. 《大型分布式網站架構——設計與實踐》陳康賢著。