2011-11-29 38 views
5

我正在使用ActiveMQ 5.4和KahaDB作爲消息存儲。 將消息發佈(具有持久性爲true)的主題(具有持久訂閱者)時,即使將消息分發到訂閱服務器,持久性存儲也在增加。所以這就引起了一個問題,因爲消息存儲庫已經滿了,並且不再接受任何消息。ActiveMQ KahaDB Persistence Store Full

所以我的問題是爲什麼持久性存儲沒有放棄KahaDB中的消息,即使消息正在分派?

問候,

SRINIVAS

回答

8

你們看到的是ActiveMQ message store行爲和爲durable subscriptions on topics之間的相互作用。

當您有持久訂閱時,主題將被視爲每個訂戶的clientId(在Connection上設置)的隊列。邏輯是客戶端在斷開連接時不想錯過任何消息。因此,如果它們斷開連接,則持久預訂會掛起並保持消息存活。

AMQ消息存儲爲其消息日誌使用數據日誌。這些是按順序寫入的,並且從未實際刪除(這將需要隨機訪問)。還有第二個文件跟蹤哪些消息已被使用。一旦數據文件中的所有消息都被消耗完後,該文件將被刪除。

因此,您所看到的是數據文件中的某些消息沒有被這些持久訂閱所佔用,而只是停留在周圍。不持續使用持久訂戶的ClientIds會導致此問題。如果您使用JMX檢查代理上的訂閱,這可能有助於找出根本原因,那麼該功能的使用方式可能會出現問題。

作爲一般規則,每當您認爲您可能想要使用持久訂閱時,請使用virtual topics代替 - 它們更易於推理,檢查和負載均衡。另一方面,如果您只想在重新連接主題訂閱者時獲取最後幾條消息,而不是您可能錯過的所有消息,請使用retroactive consumers

解決此問題的一個簡單方法是在發送消息時始終使用use a time to live - 幾乎每個用例都有消息應該消費的時間限制。除此之外,ActiveMQ會將消息過期,並將數據文件中的消息釋放以供刪除。

相關問題