📅  最后修改于: 2023-12-03 15:18:35.113000             🧑  作者: Mango
如果你使用 Pika 库来连接 RabbitMQ 服务器,并且在使用的时候出现了 (406, "precondition_failed - queue's non-equivalent arg 'durable'")
错误,那么你就遇到了 Pika.exceptions.ChannelClosedByBroker
异常。这个异常意味着 RabbitMQ 客户端和服务器之间的通道发生了错误关闭。
RabbitMQ 的队列有多个参数,其中包括 durable
、exclusive
和 auto_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
异常时,你应该检查队列的声明参数是否一致,并使用上述两种方法中的一种来解决这个问题。