RabbitMQ - обновлен до новой версии и получил много «PRECONDITION_FAILED неизвестного тега доставки 1» - PullRequest
16 голосов
/ 22 февраля 2011

Только что обновлен до новой версии RabbitMQ - 2.3.1 - и теперь возникает следующая ошибка:

PRECONDITION_FAILED unknown delivery tag 1  

... с последующим закрытием канала. Это работало на старом RabbitMQ без изменений на стороне клиента.


С точки зрения поведения приложения:

Когда приложение A хочет отправить асинхронное сообщение в приложение b и получить ответ от B, это алгоритм:

  1. Приложение A генерирует уникальный идентификатор и помещает его в объект сообщения
  2. Затем приложение A подписывается на новую очередь с именем очереди и ключом маршрутизации, равным uuid.
  3. Приложение B открывает сообщение, делает некоторые вычисления и возвращает результат в канал с полученным ключом маршрута.
  4. Приложение A получает ответ и закрывает очередь.

Пока что в 1.7.0 все прошло очень хорошо. что пошло не так в 2.3.1?


Когда приложение A вызывает basicPublish(), приложение B немедленно выдает следующее исключение:

com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.close>(reply-code=406,reply-text=PRECONDITION_FAILED - unknown delivery tag 1,class-id=60,method-id=80),null,""}
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:191)
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:159)
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:110)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:438)
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.close>(reply-code=406,reply-text=PRECONDITION_FAILED - unknown delivery tag 1,class-id=60,method-id=80),null,""}

Ответы [ 2 ]

25 голосов
/ 23 февраля 2011

Единственный путь к коду, который может вызвать это исключение, - через посредника, обрабатывающего «basic.ack», так что это звучит как проблема клиента;проверьте код клиента.

В частности, убедитесь, что вы не проверяете сообщения более одного раза.Это нарушает спецификации AMQP 0-9-1:

Сообщение НЕ ДОЛЖНО подтверждаться более одного раза.Принимающий узел ДОЛЖЕН подтвердить, что ненулевой тег доставки относится к доставленному сообщению, и вызвать исключение канала, если это не так

Отличное место, чтобы задать такие вопросы - rabbitmq-обсудить mainling-list;все разработчики RabbitMQ читают этот список и не оставляют вопросов без ответа.

Стоит также отметить, что предыдущие версии Rabbit были более слабыми и в этом случае не выдавали ошибку, но более поздние версии делают это..

5 голосов
/ 28 января 2016

Просто установите noAck: false на BasicConsume метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...