一、編譯
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配置檔案
View Code
注:brokerURL的位址是在conf/activemq.xml裡定義裡,見下面的片段
另外,連接配接ActiveMQ預設情況下,沒有任何安全機制,也就是說任何人隻要知道brokerURL都能連接配接,這顯然不安全,可以在activemq.xml裡,找到<broker>節點,緊貼它的地方添加下面這段:
那麼問題來了,這個${activemq.username}及${activemq.password}的值是在哪裡定義的呢?仍然在activemq.xml裡找答案,在最開始的地方有一段:
換句話說,conf/credentials.properties這裡儲存的就是連接配接activemq的使用者名和密碼,啟用連接配接的安全機制後,spring的配置檔案要做如下調整:
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手動确認,參考以下代碼: