RabbitMQ-升级到一个新版本,获得了很多;前提条件“未知交付标签1失败”;

RabbitMQ-升级到一个新版本,获得了很多;前提条件“未知交付标签1失败”;,rabbitmq,Rabbitmq,刚刚升级到RabbitMQ的新版本--2.3.1--现在出现以下错误: PRECONDITION_FAILED unknown delivery tag 1 …然后频道关闭。这在旧RabbitMQ上工作,没有客户端更改 在应用程序行为方面: 当应用程序A希望向应用程序b发送异步消息并接收b的答复时,以下是算法: 应用程序A生成一个唯一的ID并将其放入消息对象中 然后appa订阅一个新队列,队列名称和路由密钥都等于uuid 应用程序B打开消息,进行一些计算,并使用接收到的routkey将结

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

PRECONDITION_FAILED unknown delivery tag 1  
…然后频道关闭。这在旧RabbitMQ上工作,没有客户端更改


在应用程序行为方面:

当应用程序A希望向应用程序b发送异步消息并接收b的答复时,以下是算法:

  • 应用程序A生成一个唯一的ID并将其放入消息对象中
  • 然后appa订阅一个新队列,队列名称和路由密钥都等于uuid
  • 应用程序B打开消息,进行一些计算,并使用接收到的routkey将结果返回到频道
  • 应用程序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,""}
    
    com.rabbitmq.client.ShutdownSignalException:通道错误;原因:{#方法(回复代码=406,回复文本=Premission_失败-未知传递标记1,类id=60,方法id=80),null,“}
    位于com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:191)
    在com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:159)上
    位于com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:110)
    位于com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:438)
    原因:com.rabbitmq.client.ShutdownSignalException:通道错误;原因:{#方法(回复代码=406,回复文本=Premission_失败-未知传递标记1,类id=60,方法id=80),null,“}
    
    唯一可能导致该异常的代码路径是通过代理处理“basic.ack”,因此这听起来像是客户端问题;检查客户端代码

    特别是,检查您没有多次确认邮件。这样做违反了AMQP 0-9-1规范:

    对消息的确认不得超过一次。接收对等方必须验证非零传递标记是否引用传递的消息,如果不是这样,则引发通道异常

    一个问这些问题的好地方是拉比特列表;所有RabbitMQ开发人员都阅读了该列表,并强调不要留下未回答的问题


    同样值得注意的是,以前版本的Rabbit更为宽松,在这种情况下没有抛出错误,但最近的版本会抛出错误。

    只需在
    BasicConsume
    方法上设置
    noAck:false
    。但“未知传递标记”似乎表示您在通道上发出了一个命令,该命令引用了之前未生成的传递标记。这个断言可能是新的(检查rabbitmq源代码)?您可能应该尝试用最少的代码重现这个问题,并在这里共享它;我听从了你的建议,从rabbitMQ的Matthias那里得到了一个答案——我将在这里公布他的答案:我应该已经确认了消息。因此,使用ack=true-->channel.basicConsume(queueName,true,queueingConsumer);,订阅频道。谢谢。你能发布一个更详细的答案吗,请从你的评论中不完全理解答案,谢谢。