【发布时间】:2020-06-12 07:37:19
【问题描述】:
现在我有一些同步作业,它们是有状态的,所以如果任务失败,我必须取消确认消息,然后让它们转到RabbitMQ 的前面。但是当我尝试引发错误时,我发现 celery 仍然会确认此消息,并且队列已被清除。
@celery.task(bind=True)
def my_task(self, *args, **kwargs):
raise ValueError
我发现 celery 任务有一个名为 retry 的方法,但它会将任务添加到队列的后面。这不是我想要的。
@celery.task(bind=True)
def my_task(self, *args, **kwargs):
try:
raise ValueError
except Exception:
self.retry(countdown=15)
即使我不能用终止信号来做到这一点:
os.kill(os.getpid(), signal.SIGKILL)
我该怎么办? celery 是否提供了一些错误,以便我可以引发此错误以通知 celery 不确认我的消息?
【问题讨论】:
-
尝试将
retry与acks_late结合使用。在 Celery 的官方常见问题解答docs.celeryproject.org/en/stable/… 中有更多详细信息对于失败的任务,您可以尝试设置任务优先级(不确定您将如何使用retry来做到这一点...因为我还没有尝试过这个功能) . docs.celeryproject.org/en/stable/userguide/routing.html -
@teng
retry和acks_late没有帮助。它会将任务添加到队列的后面。