如何實現ActiveMq的Topic的持久訂閱

2021-07-24 03:25:38 字數 2150 閱讀 2422

(1)使用queue,即佇列時,每個訊息只有乙個消費者,所以,持久化很簡單,只要儲存到資料庫即可

。然後,隨便乙個消費者取走處理即可。某個消費者關掉一陣子,也無所謂。

(2)使用topic,即訂閱時,每個訊息可以有多個消費者,就麻煩一些。

首先,假設消費者都是普通的消費者,

------------------------

<1>activemq啟動後,發布訊息1,可惜,現在沒有消費者啟動著,也就是沒有消費者進行了訂閱。那麼

,這個訊息就被拋棄了。

<2>消費者1啟動了,連線了activemq,進行了訂閱,在等待訊息~~

activemq發布訊息2,ok,消費者1收到,並進行處理。訊息拋棄。

<3>消費者2也啟動了,連線了activemq,進行了訂閱,在等待訊息~~

activemq發布訊息3,ok,消費者1,消費者2都收到,並進行處理。訊息拋棄。

<4>消費者1關掉了。

activemq發布訊息4,ok,消費者2收到,並進行處理。訊息拋棄。

<5>消費者1又啟動了。

activemq發布訊息5,ok,消費者1,消費者2都收到,並進行處理。訊息拋棄。

-----------------------------

總結一下:

activemq只是向當前啟動的消費者傳送訊息。

關掉的消費者,會錯過很多訊息,並無法再次接收這些訊息。

如果傳送的訊息是重要的使用者同步資料,錯過了,使用者資料就不同步了。

那麼,如何讓消費者重新啟動時,接收到錯過的訊息呢?

答案是持久訂閱。

(3)普通的訂閱,不區分消費者,場地裡有幾個人頭,就扔幾個饅頭。

持久訂閱,就要記錄消費者的名字了。

張三說,我是張三,有饅頭給我留著,我回來拿。

李四說,我是李四,有饅頭給我留著,我回來拿。

activemq就記下張三,李四兩個名字。

那麼,分饅頭時,還是乙個人頭給乙個饅頭。

分完了,一看張三沒說話,說明他不在,給他留乙個。

李四說話了,那就不用留了。

張三回來了,找activemq,一看,這不張三吧,快把他的饅頭拿來。

可能是乙個饅頭,也可能是100個饅頭,就看張三離開這陣子,分了多少次饅頭了。

activemq區分消費者,是通過clientid和訂戶名稱來區分的。

// 建立connection

connection = connectionfactory.createconnection();

connection.setclientid("bbb"); //持久訂閱需要設定這個。

connection.start();

// 建立session

session session = connection.createsession(false,session.auto_acknowledge);

// 建立destination

topic topic = session.createtopic("usersynctopic"); //topic名稱

//messageconsumer consumer = session.createconsumer(topic); //普通訂閱

messageconsumer consumer = session.createdurablesubscriber(topic,"bbb"); //持久訂閱

(4)還有一點,訊息的生產者,傳送訊息時用使用持久模式

messageproducer producer = ...;

producer.setdeliverymode(deliverymode.persistent);

不設定,預設就是持久的

(5)使用相同的「clientid」,則認為是同乙個消費者。兩個程式使用相同的「clientid」,則同時只能有乙個連線到activemq,第二個連線的會報錯。

(6)activemq的設定在conf/activemq.xml中,預設訊息是儲存在data/kahadb中,重啟activemq訊息不會丟。

可以訪問

檢視當前的佇列、topic和持久訂戶的資訊、傳送訊息等等,很方便。

可以複製activemq-jdbc.xml中的內容過來,修改一下,就可以把訊息儲存在其它資料庫中了。

如何實現ActiveMq的Topic的持久訂閱

整理 如何實現activemq的topic的持久訂閱 web.xml中的配置作用 整理 activemq的簡單使用方法 新增日期 2013 9 5 10 23 29 快速返回 返回列表 閱讀8971次 1 使用queue,即佇列時,每個訊息只有乙個消費者,所以,持久化很簡單,只要儲存到資料庫即可 然...

ActiveMQ實現訊息佇列

實現訊息佇列 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 32 service public class providerservice 123 4567 891011 1213 1415 1617 1819 2...

如何避免activeMQ資料丟失

做訊息持久化 借助 jdbc,kahadb或 leveldb zookeeper 首先將將訊息傳送設定為持久化傳送 mq自帶的屬性 然後再借助jdbc kahadb leveldb zookeeper等做訊息的儲存來持久化。思想都是傳送者 訊息生產者 將訊息傳送出去後,訊息中心首先將訊息儲存到本地資...