2016-07-21 174 views
2

我的任務是調查爲什麼db - *。日誌文件未被清除。ActiveMQ - Kahadb日誌文件不會清除

從我通過大量搜索找到的信息來看,一切都指向隊列中的消息。我已經在所有已配置主題的隊列中查看了hawtio,隊列大小爲零。

從我的理解來看,Enqueue的大小和Dequeue的大小在理論上應該是一樣的,但事實並非如此。似乎我的出隊大小爲0.

我看了一下主題,並沒有任何操作來清除它們。

我希望能夠清除所有消息,以便kahadb日誌將消失。

+0

您需要添加更多的細節。由於這似乎是您正在使用的主題,因此需要定義您正在執行的操作,因爲除非持續訂閱,否則主題上的消息會被觸發並被忘記。 –

+0

您是否爲所有消息設置了過期期限,或者您的消息永不過期? –

回答

1

將此日誌配置添加到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 
+0

你可以請看看https://stackoverflow.com/questions/48579060/could-not-start-2-embedded-active-mq-on-different-ports-within-different-spring? – gstackoverflow

1

我認爲你指出了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
在我們的案例中,消息永不過期,那麼這也可能是這種情況下的潛在問題。但是,如果設置到期時間可能會破壞「未發送」的消息,目前尚不清楚。 因爲我們不想丟失任何事件,所以這些特定隊列沒有到期時間。

根據你的問題,它看起來你是在第二種情況下,那麼我們的解決方案是:

  1. 確保沒有更多的生產者/消費者連接到的ActiveMQ的
  2. 確保所有的隊列和耐用主題是空
  3. 刪除在KahaDB存儲所有文件(來自文件系統)
  4. 重新啓動的ActiveMQ(鮮)

不幸的是,我們沒有找到更好的方法來處理這些案件,如果別人有更好的選擇,我們會很樂意知道這一點。

This article也可以給你一些解決方案(例如設置ActiveMQ.DLQ隊列的過期策略)。