Подтвердить что ты не робот

HornetQ: удалить все сообщения из очереди, не работающие с потребителем в очереди

У меня есть простой тестовый пример, когда я запускаю сервер HornetQ (V2.4.7.Final) как часть контекста Spring. Это работает очень хорошо, и у меня есть доступ к очереди через JMS, HornetQ API и/или JMX.

TestCase

Предполагается, что тестовый сценарий опустит очередь при запуске, проверьте, что она пуста, а затем добавьте 10 сообщений в очередь. Пока в этой очереди нет потребителей, это работает с использованием либо очереди управления, либо JMSQueueControl. Даже выполнение некоторых операций в очереди через JMX работает хорошо.

Описание проблемы

Как только я добавляю слушателя сообщений в эту очередь с помощью конфигурации Spring - и слушатель потребляет сообщения, как ожидалось, - я не могу удалить все сообщения из очереди. Ни вызов метода через JMX, ни очередь управления, ни JMSQueueControl не работают, т.е. Методы вызываются без исключения, но они не показывают никакого эффекта.

Я подумал, что, возможно, мне нужно приостановить очередь, прежде чем делать некоторые изменения в ее содержании, но приостановка также не работает. Я вижу, что очередь приостанавливается через JMX, и об этом сообщается при использовании API, но потребитель все еще потребляет сообщения из самой очереди. Таким образом, я думаю, что это не было приостановлено вообще.

Я знаю, что это сложно без исходного кода, но с моей точки зрения все это довольно простая настройка, поскольку вы находите ее во многих и многих учебниках. Может ли кто-нибудь дать совет, что я делаю неправильно. В случае, если какой-либо исходный код необходим, оставьте комментарий, и я добавлю части revelant.

4b9b3361

Ответ 1

HornetQ поддерживает удаление сообщений, находящихся в очереди на стороне брокера. Как только сообщения отправляются потребителю и буферизуются на потребителе, невозможно удалить сообщения из потребительского буфера с помощью любого API управления.

Один из способов решить эту проблему (если нужно) - отключить буферизацию потребителей, установив размер окна "потребительский" на 0, но помните о возможном ухудшении производительности.

В противном случае вам необходимо обращаться с программным обеспечением; добавив некоторые проверки достоверности перед обработкой сообщения.

Подробнее об управлении потоком HornetQ Flow вы можете прочитать здесь https://docs.jboss.org/hornetq/2.2.5.Final/user-manual/en/html/flow-control.html