如何从rabbitMQ中永久删除芹菜任务?

时间:2014-07-23 00:02:18

标签: python rabbitmq celery amqp django-celery

我目前的芹菜设置有大约10,000个预定任务。我没有意识到计划的任务是什么,并决定用它们提前几个月发送后续电子邮件。

回顾过去,将来任务计划超过1小时可能永远不是一个好主意,因为每次重新启动工作人员时,必须从rabbitMQ重新接收每个计划任务,然后他们全部只是坐在记忆中。

我的问题是,如果我必须撤销任务,它不会删除它。任务保留在内存中,但撤销队列现在包含任务的ID。当它被执行时,芹菜会检查它是否被撤销,如果是,它将在此时撤销它。

但是,该任务在此之前仍将保留在内存中,如果我随时重新启动我的工作程序,则撤销队列将被清除,因为我没有使其保持持久性。

如何从芹菜工人那里永久删除任务?我基本上只需要向RabbitMQ发送一个已确认的信息,以便兔子一次性删除它,如果我重新启动芹菜,它就不会再回来了。

我查看了文档和源代码,并尝试在shell中自己完成,但我无法找到将任务交给rabbitMQ然后永久弹出它的适当位置。

2 个答案:

答案 0 :(得分:2)

如果您只使用一个队列或一个任务,这很容易:

来自docs

答案:您可以使用celery purge命令清除所有已配置的任务队列:

$ celery -A proj purge

或以编程方式:

>>> from proj.celery import app
>>> app.control.purge()
1753

如果您只想清除特定队列中的邮件,则必须使用AMQP API或celery amqp实用程序:

$ celery -A proj amqp queue.purge <queue name>

数字1753是已删除的邮件数。

您也可以使用--purge参数启动worker,以便在工作人员启动时清除消息。

更新: 如果您有多个队列或任务

我不知道有任何方法可以在RabbitMQ中编辑它们,因为服务器不是为了访问/编辑/删除排队任务而构建的,但你总是可以在代码中禁用你的任务:

@task
def my_old_task()
   pass

这样,所有任务都将按计划运行,但不会执行任何操作;因为它们既没有重命名也没有删除,所以你不会有任何错误。

显然,您应该更新代码以停止安排这些任务。一段时间后,将不再安排此类型的任务,因此您可以删除代码。

答案 1 :(得分:2)

1。 要正确清除等待任务的队列,您必须 必须 才能停止所有工作人员(http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are-still-messages-left-in-the-queue):

$ sudo rabbitmqctl stop

或(如果RabbitMQ /消息代理由Supervisor管理):

$ sudo supervisorctl stop all

2。 ...然后从特定队列中清除任务:

$ cd <source_dir>
$ celery amqp queue.purge <queue name>

3。 启动RabbitMQ:

$ sudo rabbitmqctl start

或(如果RabbitMQ由Supervisor管理):

$ sudo supervisorctl start all