Удалить сообщение из Rabbit MQ после ограниченных попыток запроса

Я помещаю записи из файла в Rabbit MQ, читаю записи из очереди и вызываю службу. Для отклоненных записей я отправляю отрицательное подтверждение и повторно ставлю в очередь с помощью метода channel.basicNack. Но требование состоит в том, что нам нужно сделать только 3 попытки вызов службы. После этого мы должны удалить сообщение из очереди, а продолжать вызывать службу снова и снова.


person user    schedule 21.09.2016    source источник


Ответы (1)


При последней попытке установите для аргумента requeue в basicNack значение false.

person Gary Russell    schedule 21.09.2016
comment
Спасибо за ответ, Гэри. Я хочу знать, как проверить, сколько раз было обработано одно и то же сообщение. Я где-то читал об установке счетчика заголовков properties.getHeaders().put(x-header-count, count++) где свойства имеют тип AMQP.BasicProperties в качестве аргумента для handleDelivery() потребителя - person user; 22.09.2016
comment
Нет; это не поможет - RabbitMQ повторно доставляет то же сообщение - вы не увидите никаких измененных заголовков. Единственное, что он предоставляет, — это логическое свойство redelivered. Вы должны поддерживать состояние (количество попыток) в своем приложении на основе чего-то уникального в сообщении. Перехватчик повторных попыток Spring AMQP с отслеживанием состояния по умолчанию использует заголовок messageId, но для этого отправитель должен установить для него уникальное значение. - person Gary Russell; 22.09.2016
comment
Спасибо. Но channel.basicNack(envelope.getDeliveryTag(), false, true); не повторно ставит сообщение в очередь. Во время публикации я устанавливаю идентификатор сообщения в какое-то уникальное значение. Теперь, потребляя, я проверяю, был ли этот идентификатор сообщения повторно доставлен. Значит ли это, что свойства messageID не сохраняются после повторной доставки того же сообщения? Если нет , тогда не могли бы вы предложить какой-нибудь способ? - person user; 27.09.2016
comment
Это сработало. Это была моя ошибка. Я указал значение true в basicConsume(). Спасибо. - person user; 27.09.2016