将参数传递给Celery任务的on_failure方法

时间:2017-07-28 18:39:08

标签: python task celery scheduled-tasks django-celery

我正在创建一个自定义Celery任务类,以覆盖当任务达到最大重试次数(on_failure)时发生的事情。如果任务失败,我需要更新用户模型的状态。

以下是我的自定义任务类:

class ReadyTask(Task):

     def run(self, user):
         try:
             user.get_results()
         except Exception as exc:
             raise self.retry(exc=exc, max_retries=3)

     def on_failure(self, exc, task_id, *args, **kwargs):
         user.status = Status.READY
         user.save()

如何将User对象传递给on_failure()方法以更新其状态?

2 个答案:

答案 0 :(得分:0)

我相信,如果您在调用任务时将其作为参数发送到任务中,则可以检查您的argskwargs用户ID。如果你在kwargs中制作它更容易,所以你不必进行arg位置检查。然后从id中抓取您的用户并进行更改?

因此,不要将其发送到run函数,而是作为您正在调用的任务的函数的参数/关键字参数,通过function.apply(kwargs)function.apply_async(kwargs=kwargs)function.delay(kwargs)

所以:

user_id = kwargs.get('user_id')

# then resolve to user object, then update object

答案 1 :(得分:0)

您还可以将对象绑定到自定义任务类。使用bind=True

class ReadyTask(Task):

     def run(self, user):

         self.user_object = user

         try:
             self.user_object.get_results()
         except Exception as exc:
             raise self.retry(exc=exc, max_retries=3)

     def on_failure(self, exc, task_id, *args, **kwargs):
         self.user_object.status = Status.READY 
         self.user_object.save()

@app.task(base=ReadyTask, bind=True)
def do_stuff(self, *args, **kwargs):
    self.user_object.do_stuff()