第19页的“RabbitMQ in Action”一书给出了独占和自动删除的描述:
exclusive - 当设置为true时,您的队列将变为私有,并且只能 由您的应用程序使用。当您需要限制队列时,这非常有用 只有一个消费者。
自动删除 - 最后一次自动删除队列 消费者取消订阅。如果需要仅由一个使用的临时队列 消费者,将自动删除与独占结合起来。当消费者 断开连接,队列将被删除。
但据我所知,使用独占时,自动删除是多余的。只需要独家。 RabbitMQ tutorial似乎就是这样说的
...一旦我们断开消费者,就应该删除队列。有 这是一个独家标志:
result = channel.queue_declare(exclusive=True)
在该教程中没有提及自动删除和sudo rabbitmqctl list_bindings
似乎表明在接收器离开后队列实际上被删除了。
答案 0 :(得分:50)
当消费者断开连接时,exclusive
队列确实会自动删除(请参阅下面粘贴的documentation)。但是,在某些情况下,您希望队列是非独占的,但仍然会自动删除(例如,如果我想添加其他消费者)。
<强>独家强>
独占队列只能由当前连接访问,并在该连接关闭时删除。不允许通过其他连接被动声明独占队列。
自动删除强>
如果设置,则在所有使用者完成使用后删除队列 它。最后一个消费者可以明确地或因为取消 它的频道已关闭。如果队列中没有消费者,那就是 不会被删除。应用程序可以明确删除自动删除 正常使用Delete方法排队。
就个人而言,我更喜欢不使用这些参数,而是选择RabbitMQ queue expiration参数,如果我有消费者断开连接然后立即(或短时间)重新连接,那么这个参数会更好;在这种情况下,消息不会丢失。但是,当然这一切都取决于您的应用和要求。
答案 1 :(得分:7)
与Mayer所描述的相反,我的测试表明,当self设置为true时,切换自动删除时的行为会有所不同。如果auto-delete设置为false,则队列确实与连接关联,并在连接终止时消失。如果将auto-delete设置为true,则在取消最后一个使用者后将删除该队列。连接和消费者之间存在差异。您可以连接,但不能使用给定的队列。如果您需要将队列的生命周期与您的连接绑定,而不是与您是否主动使用它,请将auto-delete设置为false并与exclusive = true一起使用。