Проблема здесь в том, что вы подтверждаете сообщение из экземпляра QueueBrowser
, которое не будет иметь никакого влияния, поскольку браузеры предназначены только для просмотра сообщений и не используют их.
...
QueueBrowser queueBrowser = consumerSession.createBrowser(queue);
Enumeration msgs = queueBrowser.getEnumeration();
while (msgs.hasMoreElements()) {
...
ActiveMQTextMessage message = (ActiveMQTextMessage) msgs.nextElement();
...
try {
...
message.acknowledge(); // this does nothing
Вы фактически создают реальное потребление и вызывают consumer.receive(1000)
, но вы отбрасываете экземпляр Message
, который возвращает receive()
.Это экземпляр Message
, который необходимо подтвердить для фактического использования сообщения из очереди.
...
// Create a message consumer from the session to the queue.
final MessageConsumer consumer = consumerSession.createConsumer(consumerDestination);
...
while (msgs.hasMoreElements()) {
...
try {
...
Message actualMessage = consumer.receive(1000); // acknowledge this!
...
Еще одно важное замечание ... Сообщения, которые получает браузер очереди, не обязательно являются статическим снимкомочереди.Поэтому опасно предполагать, что ваш вызов consumer.receive(1000)
на самом деле является тем же сообщением, которое пришло из браузера очереди.По моему мнению, вам следует переработать эту логику, чтобы она работала только с MessageConsumer
и отбросить QueueBrowser
.