RabbitMQ - 升级到新版本并获得了很多“PRECONDITION_FAILED未知交付标签1”

时间:2011-02-22 08:24:32

标签: rabbitmq

刚升级到RabbitMQ的新版本 - 2.3.1 - 现在出现以下错误:

PRECONDITION_FAILED unknown delivery tag 1  

...随后关闭频道。这适用于较旧的RabbitMQ,没有客户端更改。


在应用程序行为方面:

当App A想要向App b发送异步消息并从B接收答案时,这就是算法:

  1. App A生成唯一ID并将其放入消息对象
  2. 然后App A订阅一个新的队列,队列名称和路由键都等于uuid。
  3. App B打开邮件,进行一些计算,并使用收到的路径将结果返回到频道。
  4. App A得到答案并关闭队列。
  5. 到目前为止,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 个答案:

答案 0 :(得分:25)

唯一可以导致该异常的代码路径是通过代理处理'basic.ack',所以这听起来像是客户端问题;检查客户端代码。

特别要检查您是否不止一次收到消息。这样做违反了AMQP 0-9-1规范:

  

不得多次确认消息。接收对等方必须验证非零传递标记是否指向已传递的消息,并在不是这种情况下引发通道异常

提出这些问题的好地方是rabbitmq-discuss mainling-list;所有RabbitMQ开发人员都阅读了该列表,并指出不要回答问题的问题。

值得注意的是,以前版本的Rabbit更加宽松,并且在这种情况下没有抛出错误,但是更新版本的确如此。

答案 1 :(得分:5)

只需在noAck: false方法

上设置BasicConsume即可