ActiveMQ消息持久化訂閱

在之前的介紹中,我們瞭解到在ActiveMQ中默認的Queue模式下,我們的消息是會進行持久化的,我們也介紹了其相關的機制,見ActiveMQ存儲的持久化機制,而在Topic模式下,消息在消費者消費的情況下,以及ActiveMQ服務重啓的時候,會發送丟失的情況的。


ActiveMQ存儲的持久化機制中,我們介紹了是可以將消息的持久化到數據庫的,ActiveMQ啓動時會自動幫我們生成三張表的——ACTIVEMAQ_ACKSACTIVEMQ_LOCKACTIVEMQ_MSGS,其中ACTIVEMQ_MSGS是用來存儲用於存儲消息,Queue和Topic都存儲在這個表中的。


那麼我們就會思考了,Topic模式消息就丟失了,怎麼還需要進行存儲呢?那肯定是因爲我們可以進行相關的配置,讓Topic模式也和Queue模式一樣進行持久化,那麼該如何設置呢?


這裏我們還是先來以使用原生ActiveMQ的API編程中的代碼爲例,其中我們以Topic模式來進行收發消息,其中消息的生產者,我們不需要做任何改動,這裏只要對消費者進行改動即可:

  1. 需要設置客戶端id:connection.setClientID("xxx");
  2. 將消息的目的地Destination變爲Topic
  3. 將消費者類型MessageConsumer變爲TopicSubscriber
  4. 消費者創建時變爲session.createDurableSubscriber(topic, "任意名字,代表訂閱名 ");
  5. 首次需要運行一次消費者,將消費者在ActiveMQ上進行一次註冊

接下來,我們來看看代碼中的修改,如下我們先增加了其上述說的定義變量
在這裏插入圖片描述


然後我們就來看看其實際的操作步驟,如下:
在這裏插入圖片描述


這樣我們就完成了ActiveMQ中的Topic持久化訂閱了,生產者裏不用修改,代碼見使用原生ActiveMQ的API編程的Topic消息生產者代碼。


接下來我們就來進行測試,這裏我們需要注意的是,在我們Topic第一次持久化訂閱的時候,我們一定要先啓動消息的消費者,主要是爲了讓消費者在ActiveMQ上進行一次註冊。然後就可以在ActiveMQ的管理控制檯subscribers頁面可以看見我們的消費者。如下:
在這裏插入圖片描述

第一欄就是活躍持久化Topic訂閱者

第二個爲不活躍的持久化訂閱者,當我們將消費者服務結束,我們就會在第二個欄中看到它

第三個爲未持久化的Topic訂閱者,就是我們普通的Topic消費者啓動會這這裏出現,這裏還包括了我們的活躍持久化Topic訂閱者,即第一欄內容



除此之外,我們還在ActiveMQ存儲的持久化機制中,介紹數據庫進行持久化的時候,說過了生成的三種表,其中ACTIVEMAQ_ACKS是用於存儲訂閱關係。如果是持久化Topic,訂閱者和服務器的訂閱關係在這個表保存,這裏我們就來查看下這種表,如下:
在這裏插入圖片描述
在第一次啓動持久化訂閱的Topic消費者後,其訂閱關係就被存儲下來的,這裏只要不刪除該條記錄,下次我們就無需指定生產者、消費者啓動的順序了。


這裏我們就可以進行測試,無論是先啓動生產者發送消息,在啓動消費者進行消費;還是再發送完消息後,重啓ActiveMQ服務後,再啓動消費者進行消費都是可以了,因爲這裏我們的消息就和Queue模式下的一致,被存儲在ACTIVEMQ_MSGS表中了,只有當所有持久化訂閱的Topic消費者消費了,纔會被刪除。


如果想要啓動多個持久化訂閱的消費者,這裏我們可以設置不同的ClientID,即connection.setClientID("xxx");



注意:生產者端無需另外單獨配置,但是在一些特殊的情況下,生產者也是可以在持久化訂閱的Topic模式下,進行相關設置的,如
topicSubscriber = session.createDurableSubscriber(topic, "bxs");
在這裏插入圖片描述

上述是用來設置消息本身的持久化屬性爲非持久化。其主要不同點在於:當生產者發送消息後,關閉ActiveMQ服務再啓動服務,然後再去啓動消費者消費消息,即使Topic是進行了持久化訂閱的,這裏也接受不到消息了,因爲消息已經丟失了。


即說明,即使進行了持久訂閱,但是消息本身如果是不持久化的,ActiveMQ關閉再啓動,這些非持久化的消息會丟失,進行持久訂閱的消費者也是收不到自身離線期間的消息的。


當然如果ActiveMQ服務未重啓,那麼先啓動生產者,再啓動消費者,這樣還是可以消費到消息的,所以這裏意思就是相當於消息只在內存中保存,不進行持久化,ActiveMQ服務重啓即丟失。


我們在ActiveMQ存儲的持久化機制中介紹的Memory消息存儲就和設置topicSubscriber = session.createDurableSubscriber(topic, "bxs");類似,就是我們在進行了持久化Topic模式的訂閱,但是我們在ActiveMQ配置文件中,配置了Memory消息存儲,即設置了persistent=false,那麼效果和上述一致。




然後我們再來看看在SpringBoot中的用法,這裏ActiveMQ和SpringBoot結合可見ActivaMQ與SpringBoot結合,其中我們介紹過如何在SpringBoot中使用Topic模式的消息,就是在其ActiveMQ的配置類中,再加上一個配置,這裏我們在其配置中,再加上開啓持久化訂閱的設置即可,如下:
在這裏插入圖片描述




最後我們來簡單看下Spring中如何設置持久化訂閱Topic,其實也是十分的簡單,同樣的,這裏我們藉助於ActivaMQ與Spring結合 ,然後在其中的進行修改,這裏還是隻需要修改消費者的配置文件,如下:
在這裏插入圖片描述


那麼不使用jms標籤又該如何設置呢?有關不使用jms標籤,來設置Topic模式在ActivaMQ與Spring結合 已介紹,這裏我們在其基礎上進行修改,如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章