ActiveMQ訊息持久化訂閱

2021-10-06 20:55:47 字數 3403 閱讀 4894

在之前的介紹中,我們了解到在activemq中預設的queue模式下,我們的訊息是會進行持久化的,我們也介紹了其相關的機制,見activemq儲存的持久化機制,而在topic模式下,訊息在消費者消費的情況下,以及activemq服務重啟的時候,會傳送丟失的情況的。

在activemq儲存的持久化機制中,我們介紹了是可以將訊息的持久化到資料庫的,activemq啟動時會自動幫我們生成三張表的——activemaq_acksactivemq_lockactivemq_msgs,其中activemq_msgs是用來儲存用於儲存訊息,queue和topic都儲存在這個表中的。

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

這裡我們還是先來以使用原生activemq的api程式設計中的**為例,其中我們以topic模式來進行收發訊息,其中訊息的生產者,我們不需要做任何改動,這裡只要對消費者進行改動即可:

需要設定客戶端id:connection.setclientid("***");將訊息的目的地destination變為topic將消費者型別messageconsumer變為topicsubscriber消費者建立時變為session.createdurablesubscriber(topic, "任意名字,代表訂閱名 ");首次需要執行一次消費者,將消費者在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("***");

注意:生產者端無需另外單獨配置,但是在一些特殊的情況下,生產者也是可以在持久化訂閱的topic模式下,進行相關設定的,如

上述是用來設定訊息本身的持久化屬性為非持久化。其主要不同點在於:當生產者傳送訊息後,關閉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結合 已介紹,這裡我們在其基礎上進行修改,如下:

Activemq訊息持久化

官方文件 activemq持久化相關配置 usr local apache activemq 5.11.1 conf activemq.xml 官方預設的持久化為kahadb 可以稍作調優 indexwritebatchsize 1000 journalmaxfilelength 32mb enab...

ActiveMQ 訊息持久化

可持久化機制 兩種機制 用一句話簡單明瞭來說,就是將mq中的資料儲存乙份,資料被傳送,則將儲存的資料刪除,如果沒有傳送成功則重新傳送。先不說具體的實現,整體的思路是這樣的,如果mq是一台伺服器,我們最好做到物理上的備份,這樣在機器出問題的時候,我們能夠恢復資料。一般將資料儲存到第三方雲上。或者說另外...

Activemq訊息持久化

官方文件 activemq持久化相關配置 usr local apache activemq 5.11.1 conf activemq.xml 官方預設的持久化為kahadb 可以稍作調優 indexwritebatchsize 1000 journalmaxfilelength 32mb enab...