То, что вы видите, это взаимодействие между хранилищем сообщений ActiveMQ и поведением для долговременных подписок на темы .
Если у вас надежные подписки, темаобрабатывается как очередь для clientId каждого подписчика (устанавливается на Connection
).Логика заключается в том, что клиент не хочет пропустить ни одного сообщения при отключении.Так что, если они отключатся, долговременная подписка будет зависать и поддерживать сообщения в живых.
Хранилище сообщений AMQ использует журналы данных для своего журнала сообщений.Они пишутся последовательно и никогда не удаляются из (что потребует произвольного доступа).Существует второй файл, который отслеживает, какие сообщения были использованы.Как только все сообщения в файле данных будут использованы, этот файл будет удален.
Итак, вы видите, что некоторые сообщения в файле данных не используются этими долговременными подписками и просто зависают.вокруг.ClientIds для постоянных абонентов, которые не используются постоянно, могут вызвать эту проблему.Вероятно, что-то не так с использованием этой функции, если вы используете JMX для проверки подписок в брокере, что должно помочь вам найти причину.
Как правило, всякий раз, когда вы думаете, что хотите использовать долговременную подписку, используйте вместо этого виртуальные темы - их гораздо проще рассуждать, проверять и балансировать нагрузку.С другой стороны, если вы просто хотите получить последние пару сообщений при повторном подключении подписчика темы, а не все сообщения, которые вы, возможно, пропустили, используйте ретроактивных потребителей .
Простой способчтобы обойти эту проблему, нужно всегда использовать время жизни при отправке сообщения - почти в каждом случае использования есть ограничение по времени, когда сообщение должно быть использовано в любом случае.ActiveMQ истекает сообщения после этой точки, и освобождает сообщения в файлах данных для удаления.