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