首页 > 解决方案 > 运行芹菜任务时如何取消确认消息?

问题描述

现在我有一些同步作业,它们是有状态的,所以如果任务失败,我必须取消确认消息,然后让它们转到RabbitMQ. 但是当我尝试引发错误时,我发现 celery 仍然会确认此消息,并且队列已被清除。

@celery.task(bind=True)
def my_task(self, *args, **kwargs):
    raise ValueError

而且我发现 celery task 有一个名为 的方法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 不承认我的消息?

标签: pythonrabbitmqcelery

解决方案


在文档https://docs.celeryproject.org/en/stable/userguide/configuration.html我发现:

task_acks_on_failure_or_timeout默认情况下是enabled.


所以我认为你应该尝试结合

task_acks_late=True+task_acks_on_failure_or_timeout=False
实现NO acknowledgement when a task fails.


推荐阅读