使用PRECONDITION_FAILED的rabbitmq频道关闭 - 快速回复消费者不存在

时间:2018-02-16 07:26:08

标签: spring-boot rabbitmq spring-integration amqp spring-amqp

当我们从spring boot服务向rabbitmq发送消息时,我们收到以下错误。这也是间歇性的,我们无法重现这一点。

  

[AMQP Connection 123.11.xxx.xx:5672] ERROR [] org.springframework.amqp.rabbit.connection.CachingConnectionFactory - 频道关闭:频道错误;协议方法:#method(reply-code = 406,reply-text = PRECONDITION_FAILED - 快速回复消费者不存在,class-id = 60,method-id = 40)

有没有人遇到过与rabbitmq类似的问题。 请帮助我们提供您的意见。

3 个答案:

答案 0 :(得分:0)

这很可能意味着请求者已经超时并取消了直接replyTo队列中的使用者。或者,请求的应用程序已停止。

如果请求者也是Spring AMQP应用程序,则默认replyTimeout为5000毫秒(5秒)。如果服务器端需要的时间超过该时间,请求者将超时,您将在服务器上收到此错误。

您可以在请求replyTimeout上增加RabbitTemplate属性。

修改

Spring AMQP 2.0.x(需要Spring Framework 5.x)使用​​寿命更长的直接回复消费者,因此您不应该收到这些消息(但客户端仍然会超时,您会收到警告登录客户端,并在延迟交付到达时记录日志。

答案 1 :(得分:0)

对于由于此错误而最终到这里的其他人,在我看来,当我确保以下两项时,该问题已解决:

  • 发布者(“客户”)使用相同频道进行发布(发布到您要发布到的任何普通队列)以及从RabbitMQ amq.rabbitmq.reply-to队列中消费
  • 使用者(服务器)使用相同频道进行消费(从您发布到上面的任何普通队列中)以及发布到指定的RabbitMQ reply-to队列中
  • >

很遗憾,我在任何地方都看不到这个documented

答案 2 :(得分:0)

我在直接回复模式下遇到了完全相同的问题,我必须做的是:

  1. 在发布请求消息之前,确保回复(而不是请求)的使用者正在运行。

  2. 此外,正如文档所说:

<块引用>

RPC 客户端必须在自动确认模式下消费。这是因为回复消息没有队列 如果客户端断开连接或拒绝回复,则返回 留言。

  1. 正如用户 joniba 所说,我还为发布商和消费者使用了相同的模型/渠道,但我不确定这是否确实有帮助。