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