2016-07-21 5 views
2

Мне было поручено выяснить, почему файлы журнала db - * .g не очищаются.ActiveMQ - файлы журнала Kahadb не будут очищены

Из того, что я нашел в результате огромного поиска, все указывает на то, что сообщения находятся в очереди. Я просмотрел hawtio в очередях на всех настроенных тем, а размер очереди равен нулю.

С моей точки зрения размер Enqueue и размер Dequeue в теории должны быть одинаковыми, но это не так. Кажется, мой размер Dequeue равен 0.

Я просмотрел темы, и нет операции по их очистке.

Я хочу, чтобы убрать все сообщения, чтобы журналы kahadb исчезли.

+0

Вам нужно добавить больше конкретики. Поскольку это, кажется, Темы, которые вы используете, вам нужно определить, что вы делаете, поскольку сообщения на темы являются огнями и забываются, если в игре не работают длительные подписки. –

+0

Вы установили любое истечение срока для всех своих сообщений, или у вас есть сообщение, которое никогда не истекает? –

ответ

1

Добавить эту конфигурацию журнала в log4j.properties. Затем вы можете точно увидеть, что держит файлы kahadb в kahadb.log.

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 делают любит «фрагментации диска», и мы заметили это может быть, по крайней мере, двух вопросов с потребителями:

Case 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, мы видим, что все еще на страницах присутствуют события, не содержащие сообщений во всех QUEUES. Для ТЕМАТИКОВ мы прекратили использовать длительные подписки, тогда хранение также должно оставаться на уровне 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. Restart ActiveMQ (свежие)

К сожалению, мы не нашли лучшего способа справиться с этими случаями, если у кого-то есть лучшая альтернатива, мы будем рады узнать об этом.

This article также может дать вам некоторое решение (например, установить политику истечения срока действия для очереди ActiveMQ.DLQ).

0

Как альтернатива: как только вы обнаружили, какие очереди вызывают журнал существовать, вы можете отобразить его на свою собственную KahaDB, как описано здесь http://activemq.apache.org/kahadb.html

Смежные вопросы