我的任務是調查爲什麼db - *。日誌文件未被清除。ActiveMQ - Kahadb日誌文件不會清除
從我通過大量搜索找到的信息來看,一切都指向隊列中的消息。我已經在所有已配置主題的隊列中查看了hawtio,隊列大小爲零。
從我的理解來看,Enqueue的大小和Dequeue的大小在理論上應該是一樣的,但事實並非如此。似乎我的出隊大小爲0.
我看了一下主題,並沒有任何操作來清除它們。
我希望能夠清除所有消息,以便kahadb日誌將消失。
我的任務是調查爲什麼db - *。日誌文件未被清除。ActiveMQ - Kahadb日誌文件不會清除
從我通過大量搜索找到的信息來看,一切都指向隊列中的消息。我已經在所有已配置主題的隊列中查看了hawtio,隊列大小爲零。
從我的理解來看,Enqueue的大小和Dequeue的大小在理論上應該是一樣的,但事實並非如此。似乎我的出隊大小爲0.
我看了一下主題,並沒有任何操作來清除它們。
我希望能夠清除所有消息,以便kahadb日誌將消失。
將此日誌配置添加到log4j.properties。然後你就可以看到kahadb.log中的kahadb文件。
log4j.appender.kahadb=org.apache.log4j.RollingFileAppender
log4j.appender.kahadb.file=${activemq.base}/data/kahadb.log
log4j.appender.kahadb.maxFileSize=1024KB
log4j.appender.kahadb.maxBackupIndex=5
log4j.appender.kahadb.append=true
log4j.appender.kahadb.layout=org.apache.log4j.PatternLayout
log4j.appender.kahadb.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
log4j.logger.org.apache.activemq.store.kahadb.MessageDatabase=TRACE, kahadb
你可以請看看https://stackoverflow.com/questions/48579060/could-not-start-2-embedded-active-mq-on-different-ports-within-different-spring? – gstackoverflow
我認爲你指出了ActiveMQ本身的一個弱點:它不能保證消費者在消費消息時是非常嚴格的。
我們與ActiveMQ的(5.10.7),因爲它似乎KahaDB化妝喜歡一個「磁盤碎片」,但我們注意到,這可能是從至少兩個問題與消費者類似的問題:
案例1:消費緩慢
我們在我們的系統中有一個消費者不能一次消費很多消息。如果只有一個未被使用的消息保留在kahaDB頁面中,它將保留所有的整個頁面(所有其他消息已被使用並被確認)。 爲了防止KahaDB存儲達到100%(這將減緩生產商),我們在另一個ActiveMQ的情況下臨時隊列傳輸的消息是這樣的:
from("activemqPROD:queue:BIG_QUEUE_UNCONSUMED")
.to("activemqTEMP:queue:TEMP_BIG_QUEUE");
然後推回:
from("activemqTEMP:queue:TEMP_BIG_QUEUE")
.to("activemqPROD:queue:BIG_QUEUE_UNCONSUMED");
的另一種方法是將它們存儲在文件系統上,然後重新加載它們,但是會丟失JMS(和自定義)標題。使用臨時隊列解決方案可以保留所有標題。
案例2:消費者誰從來沒有給確認
有時甚至使我們前面的操作,甚至所有未隊列爲空,存儲保持高於0%。 通過查看KahaDB文件,我們可以看到仍有頁面顯示所有隊列中沒有更多消息。 對於TOPICS,我們停止使用持久訂閱,那麼存儲也應該保持在0%。
潛在的原因(這是一個假設,但有一個強烈的信心)是,一些消費的消息從來沒有正確地使用acknowledged
。 我們認爲這是原因的原因,那是因爲在日誌中,我們仍然可以看到的消息
"not removing data file: 12345 as contained ack(s) refer to referenced file: [12344, 12345]"
這可以發生,例如當消費者abruptively斷開(他們在發送之前消耗了一些消息,但斷開ack
)
在我們的案例中,消息永不過期,那麼這也可能是這種情況下的潛在問題。但是,如果設置到期時間可能會破壞「未發送」的消息,目前尚不清楚。 因爲我們不想丟失任何事件,所以這些特定隊列沒有到期時間。
根據你的問題,它看起來你是在第二種情況下,那麼我們的解決方案是:
不幸的是,我們沒有找到更好的方法來處理這些案件,如果別人有更好的選擇,我們會很樂意知道這一點。
This article也可以給你一些解決方案(例如設置ActiveMQ.DLQ隊列的過期策略)。
作爲替代方案:一旦你發現了哪個隊列導致日誌存在,你可以把它映射到自己的KahaDB喜歡這裏描述http://activemq.apache.org/kahadb.html
您需要添加更多的細節。由於這似乎是您正在使用的主題,因此需要定義您正在執行的操作,因爲除非持續訂閱,否則主題上的消息會被觸發並被忘記。 –
您是否爲所有消息設置了過期期限,或者您的消息永不過期? –