我遇到的情况是,我收到第三方服务的回复,表明我的初始请求失败,我应该重试。我在Celery任务中调用该服务。重试调用未在异常中捕获,似乎不是将任务的新实例提供给代理并继续当前任务,而是将任务交给代理并退出任务。有没有办法设置重试并继续当前任务?
答案 0 :(得分:1)
task.retry
引发RetryTaskError
异常,该异常用于检测任务是否已重试。请参阅此处的说明:http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying-a-task-if-something-fails
您可以使用throw=False
task.retry(throw=False)
# do something else
raise RetryTaskError(None, None)
如果不引发异常,则当前任务不会被标记为处于RETRY状态, 但是在SUCCESS / FAILURE状态下,取决于任务的其余部分是否成功。 由于重试任务将与当前任务共享相同的uuid,因此如果新任务在当前任务之前返回,则当前任务可以覆盖新任务的结果。 当然,如果你无视这个任务的结果也没关系。
这有意义吗?
答案 1 :(得分:0)
我的代码略有不同。在这种情况下,我有一个芹菜任务循环通过接收器列表来发送消息。如果任何发送调用失败,我不希望celery任务退出,而是继续其他接收器。
在我的情况下,task.retry(throw = False)不会发生这种情况。我确实看到了那个时刻没有做任何事情的任务。
@celery_app.task()
def send_msg_to_list():
for recvr in Emailrecvr.objects.filter(query=obj):
try:
email_rv = recvr.send(msg)
except SMTPException:
# Dont exit the loop but continue with others
send_msg_to_list.retry(throw=False)
# do some blah here