📌  相关文章
📜  pika.exceptions.channelclosedbybroker:(406,“precondition_failed - 队列的不等价 arg 'durable' (1)

📅  最后修改于: 2023-12-03 15:18:35.113000             🧑  作者: Mango

Pika.exceptions.ChannelClosedByBroker

如果你使用 Pika 库来连接 RabbitMQ 服务器,并且在使用的时候出现了 (406, "precondition_failed - queue's non-equivalent arg 'durable'") 错误,那么你就遇到了 Pika.exceptions.ChannelClosedByBroker 异常。这个异常意味着 RabbitMQ 客户端和服务器之间的通道发生了错误关闭。

异常原因

RabbitMQ 的队列有多个参数,其中包括 durableexclusiveauto_delete。 你可以在声明队列时提供这些参数。 不同的消费者或发布者在声明一个队列时,这些参数必须保持完全一致,否则将会触发我们遇到的异常。

这个异常是由于在队列的声明或绑定上,客户端和服务器之间的参数不匹配而引起的。

解决方案

解决这个异常有两种方法:

方法一

最好的解决方案是,在使用队列之前,先删除它,再对其进行完整的声明。这样可以确保队列在所有声明的地方使用的参数都相同。

channel.queue_delete(queue_name)
channel.queue_declare(queue_name,
                      durable=True,
                      exclusive=False,
                      auto_delete=False)
方法二

第二种解决方案是,在所有声明队列的地方都使用相同的队列参数。 如果 durable 参数在其中的任何一个地方被省略了,那么它的默认值是 False,这会与我们之前声明的队列参数不一致,并最终导致异常。 为了解决这个问题,你可以在队列声明时使用默认值,也就是 在每个声明的地方都将 durable 参数设置为 True

channel.queue_declare(queue_name, durable=True)

综上所述,当你遇到 Pika.exceptions.ChannelClosedByBroker 异常时,你应该检查队列的声明参数是否一致,并使用上述两种方法中的一种来解决这个问题。