ActiveMQ下載地址:https://activemq.apache.org/download-archives.html
下載後解壓, 可以在conf文件夾下的activemq.xml中修改配置信息
在bin目錄下選擇適當文件中wrapper啓動,或activemq.bat啓動
啓動不成功的話請關閉防火牆
部分術語:
JMS Provider:實現JMS 接口的消息中間件(provider:供應者);
PTP:Point to Point,即點對點的消息模型;
Pub/Sub:Publish/Subscribe,即發佈/訂閱的消息模型;
Queue:隊列目標; Topic:主題目標;Transaction:事務。
ConnectionFactory:連接工廠,JMS 用它創建連接;
Connection:JMS 客戶端到JMS Provider 的連接;
Destination:消息的目的地;Acknowledge:簽收;
Session:會話,一個發送或接收消息的線程;
MessageProducer:由 Session 對象創建的用來發送消息的對象;
MessageConsumer:由 Session 對象創建的用來接收消息的對象;
JMS 支持兩種截然不同的消息傳送模型:PTP(即點對點模型)和 Pub/Sub(即發佈 /訂閱模型),分別稱作:PTP Domain 和 Pub/Sub Domain。
PTP(使用 Queue即隊列目標)消息從一個生產者傳送至一個消費者。在此傳送模型中,目標是一個隊列。消息首先被傳送至隊列目標,然後根據隊列傳送策略,從該隊列將消息傳送至向此隊列進行註冊的某一個消費者,一次只傳送一條消息。可以向隊列目標發送消息的生產者的數量沒有限制,但每條消息只能發送至、並由一個消費者成功使用。如果沒有已經向隊列目標註冊的消費者,隊列將保留它收到的消息,並在某個消費者向該隊列進行註冊時將消息傳送給該消費者。
Pub/Sub(使用Topic即主題目標)消息從一個生產者傳送至任意數量的消費者。在此傳送模型中,目標是一個主題。消息首先被傳送至主題目標,然後傳送至所有已訂閱此主題的活動消費者。可以向主題目標發送消息的生產者的數量沒有限制,並且每個消息可以發送至任意數量的訂閱消費者。主題目標也支持持久訂閱的概念。
持久訂閱表示消費者已向主題目標進行註冊,但在消息傳送時此消費者可以處於非活動狀態。當此消費者再次處於活動狀態時,它將接收此信息。如果沒有已經向主題目標註冊的消費者,主題不保留其接收到的消息,除非有非活動消費者註冊了持久訂閱。這兩種消息傳送模型使用表示不同編程域的 API 對象(其語義稍有不同)進行處理,如下所示:
基本類型
PTP 用Queue
pub/sub 用topic
PTP模型
PTP(Point-to-Point)模型是基於隊列的,生產者發消息到隊列,消費者從隊列接收消息,隊列的存在使得消息的異步傳輸成爲可能。和郵件系統中的郵箱一樣,隊列可以包含各種消息,JMS Provider 提供工具管理隊列的創建、刪除。JMS PTP 模型定義了客戶端如何向隊列發送消息,從隊列接收消息,瀏覽隊列中的消息。下面描述 JMS PTP 模型中的主要概念和對象:
名稱 |
描述 |
ConnectionFactory |
客戶端用 ConnectionFactory,創建Connection對象。 |
Connection |
一個到 JMS Provider 的連接,客戶端可以Connection 創建Session 來發送和接收消息。 |
Session |
客戶端用Session 創建MessageProducer 和MessageConsumer 對象。如果在Session 關閉時,有 一些消息已經被收到,但還沒有被籤(acknowledged),那麼,當消費者下次連接到相同的隊列時,這些消息還會被再次接收。 |
Destination(Queue或TemporaryQueue) |
客戶端用 Session 創建Destination 對象。此處的目標爲隊列,隊列由隊列名識別。臨時隊列只能由創建它的Connection 所創建的消費者消費,但是任何生產者都可向臨時隊列發送消息。 |
MessageProducer |
客戶端用MessageProducer 發送消息到隊列。 |
MessageConsumer |
客戶端用MessageConsumer 接收隊列中的消息,如果用戶在receive 方法中設定了消息選擇條件,那麼不符合條件的消息會留在隊列中,不會被接收到。 |
Reliability (可靠性) |
隊列可以長久地保存消息直到消費者收到消息。消費者不需要因爲擔心消息會丟失而時刻和隊列保持激活的連接狀態,充分體現了異步傳輸模式的優勢。 |
PUB/SUB模型
JMS Pub/Sub 模型定義瞭如何向一個內容節點發布和訂閱消息,這些節點被稱作主題(topic)。
主題可以被認爲是消息的傳輸中介,發佈者(publisher)發佈消息到主題,訂閱者(subscribe) 從主題訂閱消息。主題使得消息訂閱者和消息發佈者保持互相獨立,不需要接觸即可保證消息的傳送。下面描述 JMS Pub/Sub 模型中的主要概念和對象:
名稱 |
描述 |
subscription (訂閱) |
消息訂閱分爲非持久訂閱(non-durablesubscription)和持久訂閱(durablesubscrip-tion),非持久訂閱只有當客戶端處於激活狀態,也就是和JMS Provider 保持連接狀態才能收到發送到某個主題的消息,而當客戶端處於離線狀態,這個時間段發到主題的消息將會丟失,永遠不會收到。持久訂閱時,客戶端向JMS 註冊一個識別自己身份的ID,當這個客戶端處於離線時,JMS Provider 會爲這個ID 保存所有發送到主題的消息,當客戶再次連接到JMS Provider 時,會根據自己的ID 得到所有當自己處於離線時發送到主題的消息。 |
ConnectionFactory |
客戶端用 ConnectionFactory 創建Connection對象。 |
Connection |
一個到 JMS Provider 的連接,客戶端可以用 Connection 創建Session 來發送和接收消息。 |
Session |
客戶端用Session 創建MessageProducer 和 MessageConsumer 對象。它還提供持久訂閱主題,或使用unsubscribe 方法取消消息的持久訂閱。 |
Destination(Topic和TemporaryTopic) |
客戶端用Session 創建Destination對象。此處的目標爲主題,主題由主題名識別。臨時主題只能由創建它的Connection 所創建的消費者消費。臨時主題不能提供持久訂閱功能。JMS 沒有給出主題的組織和層次結構的定義,由JMS Provider 自己定義。 |
MessageProducer |
客戶端用MessageProducer 發佈消息到主題。 |
MessageConsumer |
客戶端用MessageConsumer 接收發布到主題上 的消息。可以在receive 中設置消息過濾功能,這樣, 不符合要求的消息不會被接收。 |
Recovery and Redelivery (恢復和重新派送) |
非持久訂閱狀態下,不能恢復或重新派送一個未 簽收的消息。只有持久訂閱才能恢復或重新派送一個未簽收的消息。 |
Reliability (可靠性) |
當所有的消息必須被接收,則用持久訂閱模式。 當丟失消息能夠被容忍,則用非持久訂閱模式。 |
代碼編寫:
1 創建Connectionfactory對象 ActiveMQConnectionFactory()
2 創建Connection 創建後開啓start() createConnection()
3 創建sessioncreateSession()
4 創建Destination (queue隊列\topic主題) createQueue()/createTopic()
5 創建MessageProducer消息發送者 session.createProduct(queue/topic)
6 創建Message 消息 session.createTextMessage()
7 發送消息 producer.send()
send(destination,message,deliveryMode,priority,timetoLive)
deliveryMode 傳送模式 DeliveryMode.PERSISTENT 持久性消息: 默認 保證只被傳送一次,使用一次
DeliveryMode.NOT_PERSISTENT 非持久性消息
priority 優先級 0-4 普通消息5-9加急消息 默認爲 4
timetoLive 過期時間
8 創建MessageConsumer 接收消息 createConsumer(queue/topic)
9 接受消息 receive() //只能接收一條 建議使用listener 實現MessageListener接口
消息簽收
1 客戶端簽收 2 客戶端處理3 消息被簽收
1 session.AUTO_ACKNOWLEDGE收條與簽收緊隨消息處理後發生
2 session.CLIENT_ACKNOWLEDGE 簽收一個以消費的消息會自動簽收此session所有已消費的收條
3 session.DUPS_OK_ACKNOWLEDGE session不必確保對傳送消息的簽收會引起消息的重複
訂閱
消息訂閱分 持久訂閱 非持久訂閱
持久訂閱: 會識別身份,離線時會保存消息
非持久訂閱:只有當客戶端處於激活狀態,才能收到某個主題的消息,離線時會消失
createDurableSubcriber(Topic , naem , messageSelector , noLocal )
messageSelector : 消息選擇器
noLocal : 默認是false true時限制消費者只接收與自己相連所發佈的消息
name : 標識訂閱主題所對應的訂閱名稱
unsubscribe(String name) 刪除持久訂閱
事務 commid rollback