天天看點

ActiveMQ簡述

ActiveMQ是Apache所提供的一個開源的消息系統,完全采用Java來實作,是以,它能很好地支援J2EE提出的JMS(Java Message Service,即Java消息服務)規範。JMS是一組Java應用程式接口,它提供消息的建立、發送、讀取等一系列服務。JMS提供了一組公共應用程式接口和響應的文法,類似于Java資料庫的統一通路接口JDBC,它是一種與廠商無關的API,使得Java程式能夠與不同廠商的消息元件很好地進行通信。

JMS支援兩種消息發送和接收模型。一種稱為P2P(Ponit to Point)模型,即采用點對點的方式發送消息。P2P模型是基于隊列的,消息生産者發送消息到隊列,消息消費者從隊列中接收消息,隊列的存在使得消息的異步傳輸稱為可能,P2P模型在點對點的情況下進行消息傳遞時采用。

ActiveMQ簡述

另一種稱為Pub/Sub(Publish/Subscribe,即釋出-訂閱)模型,釋出-訂閱模型定義了如何向一個内容節點釋出和訂閱消息,這個内容節點稱為topic(主題)。主題可以認為是消息傳遞的中介,消息釋出這将消息釋出到某個主題,而消息訂閱者則從主題訂閱消息。主題使得消息的訂閱者與消息的釋出者互相保持獨立,不需要進行接觸即可保證消息的傳遞,釋出-訂閱模型在消息的一對多廣播時采用。

ActiveMQ簡述

下載下傳之後解壓: 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的請求處理:

輸出結果:

ActiveMQ簡述

這個是在jetty伺服器下跑的,可以修改conf/jetty.xml來修改相關jetty配置。

上面的例子是關于P2P模式的,不過有個不妥之處,就是沒有資源的釋放。下面舉一個Pub/Sub模式的。

通過JMS建立ActiveMQ的topic,并給topic發送消息:

消息發送到對應的topic後,需要将listener注冊到需要訂閱的topic上,以便能夠接收該topic的消息:

參考文獻

1. 《大型分布式網站架構——設計與實踐》陳康賢著。