2016-12-29 13 views
0

Я работаю над работником, который способен обрабатывать сообщение из RabbitMQ.Как разместить сообщение в конце очереди MQRabbit

Однако я не уверен, как это осуществить.

Если я получаю сообщение, и во время моего лечения возникает ошибка, как я могу поместить сообщение в конец очереди?

Я пытаюсь использовать nack или reject, но сообщение всегда переставляется в первую позицию, а другие сообщения остаются замороженными!

Я не понимаю, почему сообщение должно быть помещено в первую позицию, я пытаюсь «играть» с другими вариантами, такими как Requeue или AllupTo, но ни один из них не работает.

Спасибо заранее!

ответ

0

nack или отклонить либо отменить это сообщение, либо повторно отправить сообщение в очередь.

Для вашего требования следующего может быть пригодно,

После того, как потребитель получает сообщение, как раз перед запуском его обработки, отправки подтверждения() обратно RabbitMQ сервер.

Обработать сообщение после этого, если обнаружена какая-либо ошибка в процессе, затем отправить (опубликовать) одно и то же сообщение в одну очередь. Это поместит сообщение в конец очереди.

При успешной обработке ничего не делать. ack() уже отправлен на сервер rabbitmq. Просто возьмите следующее сообщение и обработайте его.

+0

Зачем нужно обрабатывать сообщения ack() и с ошибками? Подтверждение должно быть костью после обработки сообщения, иначе, если что-то пойдет не так, как раньше или во время его обработки или публикации снова это сообщение будет потеряно и удалено из очереди. Вы должны отклонить сообщение и принять решение, если хотите отменить или отменить это сообщение. –

+0

Все зависит от бизнес-требований, когда ack() сообщение до или после обработки. Мы можем отправить сообщение обратно в очередь, если какая-либо ошибка/исключение происходит в качестве последнего кода восстановления после отказа, прежде чем скрипт получит die/exit. Если есть несколько сценариев, по которым мы хотим разместить сообщение в конце очереди, а не для всех, то мы можем сохранить ack()/nack()/republish после обработки. Мы можем решить в конце либо ack/nack, либо переиздать сообщение в конце обработки. –

1

Documentation говорит:

Сообщение может быть возвращено в очередь с помощью AMQP методов, которые показывают параметр (basic.recover снова поставить, basic.reject и basic.nack), или из-за закрытием канала времени Неподтвержденный сообщений. Любой из этих сценариев вызывал сообщения, которые должны быть отправлены в очередь назад для релизов RabbitMQ раньше, чем 2.7.0. От RabbitMQ release 2.7.0 сообщения всегда хранятся в очереди в порядке публикации, даже при наличии запроса или канала закрытия.

С выпуском 2.7.0 и более поздней версии для отдельных пользователей по-прежнему возможны нарушения порядка, если в очереди имеется несколько подписчиков . Это связано с действиями других абонентов, которые могут сообщениями о требованиях. С точки зрения очереди сообщения всегда хранятся в порядке публикации.

Запомните ack ваши успешные сообщения, в противном случае они не будут удалены из очереди.

Если вам нужно больше контроля над отклоненными сообщениями, вы должны взглянуть на dead letter exchanges.