我正在创建一个自定义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()
方法以更新其状态?
答案 0 :(得分:0)
我相信,如果您在调用任务时将其作为参数发送到任务中,则可以检查您的args
或kwargs
用户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()