我遇到一种情况,我收到来自第三方服务的响应,指示我的初始请求失败,应该重试。我正在调用Celery任务中的服务。重试调用没有在异常中捕获,而且它似乎没有将任务的新实例提供给代理并继续当前任务,而是将任务提供给代理然后退出任务。有什么方法可以设置重试并继续执行当前任务吗?
task.retry
引发RetryTaskError
异常,用于检测任务是否重试。请参阅此处的注释:http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying-一项任务-某些东西-失败
您可以使用throw=False
:跳过此行为
task.retry(throw=False)
# do something else
raise RetryTaskError(None, None)
如果不引发异常,则当前任务将不会标记为处于RETRY状态,但处于SUCCESS/FAILURE状态,这取决于任务的其余部分是否成功。由于重试任务将与当前任务共享相同的uuid,因此如果新任务在当前任务之前返回,则当前任务可能会覆盖新任务的结果。当然,如果你忽略了任务的结果,这也没关系。
这有道理吗?
我的代码略有不同。在这种情况下,我有一个芹菜任务,它循环遍历一个接收者列表来发送消息。如果任何一个send调用失败,我不希望芹菜任务退出,而是继续使用其他接收器。
在我的情况下,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