天天看點

ActiveMQ筆記(1):編譯、安裝、示例代碼

一、編譯

1.2 編譯

編譯成功後,在$ACTIVEMQ_HOME/assembly/target下會生成可xxx.bin.tar.gz的可執行檔案壓縮包

二、啟動

将編譯後得到的xxx.bin.tar.gz解壓,然後執行 

後面的可選參數還有 status、restart、stop、list等,不清楚的地方,直接 --help 檢視。

注:生産環境中,可能會對activemq的jvm記憶體設定上限,可以直接修改bin/activemq啟動腳本,vi bin/activemq 找到下面的位置:

設定ACTIVEMQ_OPTS即可,然後重新開機activemq,建議啟動成功後,用jinfo {activemq的pid} 來驗證檢視一下  

三、管理界面

預設使用者名、密碼:admin/admin

管理界面是用jetty做容器的,如果想修改管理界面的端口,可以編輯../conf/jetty.xml,找到下面這一段:

使用者名/密碼是在 ../conf/jetty-realm.properties 裡,比如要增加一個管理者jimmy/123456,可參考下面修改:

注:管理界面有一個小坑,ActiveMQ 5.13.2與jdk1.8相容性有點問題,如果使用jdk1.8,管理界面進入Queues标簽頁時,偶爾會報錯,但是并不影響消息正常收發,隻是無法從界面上檢視隊列情況,如果出現該問題,可将jdk版本降至1.7,同時最好清空data目錄下的所有資料,再重新開機activemq即可。

2016-06-18 注:最新版的5.13.3已經修複了這個bug,建議大家使用最新版本。

  

四、示例代碼

通常消息隊列都支援二種模式:基于主題(topic)的釋出(Publish)/訂閱(Subscribe)模式、點對點(p2p)模式,下面的示例代碼為p2p場景。

先給出gradle項目的依賴項

4.1 spring配置檔案

ActiveMQ筆記(1):編譯、安裝、示例代碼
ActiveMQ筆記(1):編譯、安裝、示例代碼

View Code

注:brokerURL的位址是在conf/activemq.xml裡定義裡,見下面的片段

ActiveMQ筆記(1):編譯、安裝、示例代碼
ActiveMQ筆記(1):編譯、安裝、示例代碼

另外,連接配接ActiveMQ預設情況下,沒有任何安全機制,也就是說任何人隻要知道brokerURL都能連接配接,這顯然不安全,可以在activemq.xml裡,找到<broker>節點,緊貼它的地方添加下面這段:

那麼問題來了,這個${activemq.username}及${activemq.password}的值是在哪裡定義的呢?仍然在activemq.xml裡找答案,在最開始的地方有一段:

換句話說,conf/credentials.properties這裡儲存的就是連接配接activemq的使用者名和密碼,啟用連接配接的安全機制後,spring的配置檔案要做如下調整:

ActiveMQ筆記(1):編譯、安裝、示例代碼
ActiveMQ筆記(1):編譯、安裝、示例代碼

4.2 生産者代碼

發送消息的代碼有二種寫法:

a)利用spring-jms的JmsTemplate

b) 利用activeMQ的Producer

這二種方式在性能上差不多,4核8G的mac book pro上,大緻每秒可以寫入3k+條消息。但是從代碼量來講,明顯JmsTemplate的代碼量更少,推薦使用。

4.3 消費者代碼

當然也可以用JmsTemplate接收消息,但是一般得自己去寫while(true)循環,而且預設情況下,上下文如果不是同一個連接配接,JmsTemplate A發出的消息,JmsTemplate B是接收不到的,是以不建議這種方式。最好參考下面的示例,使用JMS的MessageLisenter去監聽消息,這也是JMS規範建議的标準做法:

4.4 嵌入式Broker

類似jetty、tombat之類可以内嵌到代碼中啟動一樣,ActiveMQ也可以直接在代碼中内嵌啟動,這個很友善一些輕量級的使用場景,示例代碼如下:

4.5 消息的自動确認與手動确認

在接收消息時,如果Session使用的是 Session.AUTO_ACKNOWLEDGE,即:

則消息一旦被接受,不論onMessage()裡的業務邏輯執行成功與否,消息都将從ActiveMQ的隊列裡立刻删除。如果希望業務處理成功後,再通知ActiveMQ删除消息,可以改成:

然後onMessage方法調用message.acknowledge手動确認,參考以下代碼: