刚升级到RabbitMQ的新版本 - 2.3.1 - 现在出现以下错误:
PRECONDITION_FAILED unknown delivery tag 1
...随后关闭频道。这适用于较旧的RabbitMQ,没有客户端更改。
在应用程序行为方面:
当App A想要向App b发送异步消息并从B接收答案时,这就是算法:
到目前为止,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,""}
答案 0 :(得分:25)
唯一可以导致该异常的代码路径是通过代理处理'basic.ack',所以这听起来像是客户端问题;检查客户端代码。
特别要检查您是否不止一次收到消息。这样做违反了AMQP 0-9-1规范:
不得多次确认消息。接收对等方必须验证非零传递标记是否指向已传递的消息,并在不是这种情况下引发通道异常
提出这些问题的好地方是rabbitmq-discuss mainling-list;所有RabbitMQ开发人员都阅读了该列表,并指出不要回答问题的问题。
值得注意的是,以前版本的Rabbit更加宽松,并且在这种情况下没有抛出错误,但是更新版本的确如此。
答案 1 :(得分:5)
只需在noAck: false
方法
BasicConsume
即可