我有一些队列,等等:
online_queue = self._channel.queue_declare(
durable = True,
queue = 'online'
)
目前,我需要刷新此队列中的所有内容。 但是,此时,另一个进程可能会发布到此队列。 如果我使用channel.queue_purge(queue ='online'),发布的消息会发生什么,而queue_purge仍在工作?
答案 0 :(得分:2)
根据您的最终目标,可能能够通过使用临时队列来解决此问题。
为了使事情更清楚,让我们给出一些名字。调用当前队列(要清除的队列)队列A,并假设它与交换机A绑定。
如果创建新队列(队列B)并将其绑定到Exchange A的方式与绑定队列A的方式相同,则队列B现在将获取队列A获取的所有消息(从绑定时开始)。
现在,您可以安全地清除队列A,而不会丢失在绑定队列B之后发送的任何消息。
将队列A重新绑定到Exchange A,然后重新启动并运行。
然后,您可以处理队列B中的“临时”消息,但您可能需要这样做。
这样做的好处是具有非常明确的行为,并且不会让你进入任何竞争条件,因为你可以完全击败队列A并重新创建它而不是清除。
答案 1 :(得分:0)
你描述的是竞争条件。有些可能会留在队列中,有些可能会被清除。或者所有这些都会被清除。或者他们都不会被清除。
没有办法说出来,因为这是一个与时间有关的情况。您应该重新检查是否需要清除仍处于活动状态的队列,或者构建一个更强大的消费者,这个消费者可以接受它所连接的队列中可能存在消息的事实(这基本上是消费者必须接受的消息) ,无论如何)。