2011-09-03 148 views
4

我使用芹菜+ RabbitMQ的。我无法找到方便的方式来清除芹菜+ rabbitmq中的队列。我用remove和create vhost来做。芹菜+ RabbitMQ的空队列

rabbitmqctl delete_vhost <vhostpath> 
rabbitmqctl add_vhost <vhostpath> 

它更喜欢清除一些芹菜队列的方法吗?

回答

13

我不太清楚怎么芹菜的作品,但我怀疑你想(通过删除队列,以及芹菜重新创建他们你目前模拟this)来清除一个RabbitMQ的队列。

你可以安装的RabbitMQ的Management Plugin。它的WebUI将允许你清除所需的队列。这也应该告诉你你正在瞄准哪个队列,所以你不需要删除所有的东西。

一旦你知道哪个队列是这样,你可以通过程序将其清除。例如,使用py-amqplib,你会做这样的事情:

from amqplib import client_0_8 as amqp 

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", virtual_host="/", insist=False) 
conn = conn.channel() 
conn.queue_purge("the-target-queue") 

有可能是一个更好的方式来做到这一点,虽然。

+0

conn.queue_purge不会为我工作。这是一个amqplib方法吗? – Leopd

+0

是的。查看文档和本教程:http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/ – scvalex

1

如果您需要删除队列中的所有物品(尤其是当列表很长)

1)保存所有项目到文件

sudo rabbitmqctl list_queues -p /yourvhost name > queues.txt 

不要忘记删除第一个和最后行从 'queues.txt'

2)使用提到Python代码来完成这项工作

from amqplib import client_0_8 as amqp 

conn = amqp.Connection(host="127.0.0.1:5672", userid="guest", password="guest", virtual_host="/yourvhost", insist=False) 
conn = conn.channel() 

queues = None 
with open('queues.txt', 'r') as f: 
    queues = f.readlines() 

for q in queues: 
    if q: 
     #print 'deleting %s' % q 
     conn.queue_purge(q.strip()) 

print 'purged %d items' % len(queues) 
2

如果你面对这个问题,因为你使用rabbitmq作为结果后端,结果你得到了太多的队列,那么我会建议使用不同的结果后端(redis或mongodb)

这是一个众所周知的缺陷芹菜。如果你的结果是后端,它将为每个结果创建一个单独的队列。

如果你仍然要坚持AMQP作为结果的后端。它将在24小时内自行清除。但是,您可以使用CELERY_AMQP_TASK_RESULT_EXPIRES设置将其设置为较小的值。