RabbitMQ:清除队列

时间:2011-11-25 14:57:30

标签: python rabbitmq amqp pika

我有一些队列,等等:

online_queue = self._channel.queue_declare(
                                   durable = True,
                                   queue = 'online'
                                   )

目前,我需要刷新此队列中的所有内容。 但是,此时,另一个进程可能会发布到此队列。 如果我使用channel.queue_purge(queue ='online'),发布的消息会发生什么,而queue_purge仍在工作?

2 个答案:

答案 0 :(得分:2)

根据您的最终目标,可能能够通过使用临时队列来解决此问题。

为了使事情更清楚,让我们给出一些名字。调用当前队列(要清除的队列)队列A,并假设它与交换机A绑定。

如果创建新队列(队列B)并将其绑定到Exchange A的方式与绑定队列A的方式相同,则队列B现在将获取队列A获取的所有消息(从绑定时开始)。

现在,您可以安全地清除队列A,而不会丢失在绑定队列B之后发送的任何消息。

将队列A重新绑定到Exchange A,然后重新启动并运行。

然后,您可以处理队列B中的“临时”消息,但您可能需要这样做。

这样做的好处是具有非常明确的行为,并且不会让你进入任何竞争条件,因为你可以完全击败队列A并重新创建它而不是清除。

答案 1 :(得分:0)

你描述的是竞争条件。有些可能会留在队列中,有些可能会被清除。或者所有这些都会被清除。或者他们都不会被清除。

没有办法说出来,因为这是一个与时间有关的情况。您应该重新检查是否需要清除仍处于活动状态的队列,或者构建一个更强大的消费者,这个消费者可以接受它所连接的队列中可能存在消息的事实(这基本上是消费者必须接受的消息) ,无论如何)。