2011-09-03 239 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設置將其設置爲較小的值。