我试图异步使用Web服务,因为它需要长达45秒才能返回。不幸的是,这个网络服务也有点不可靠,可能会引发错误。我已经设置了django-celery
并执行了我的任务,这可以正常工作,直到任务失败超出max_retries
。从任务恢复失败超出max_retries
这是我到目前为止有:
@task(default_retry_delay=5, max_retries=10)
def request(xml):
try:
server = Client('https://www.whatever.net/RealTimeService.asmx?wsdl')
xml = server.service.RunRealTimeXML(
username=settings.WS_USERNAME,
password=settings.WS_PASSWORD,
xml=xml
)
except Exception, e:
result = Result(celery_id=request.request.id, details=e.reason, status="i")
result.save()
try:
return request.retry(exc=e)
except MaxRetriesExceededError, e:
result = Result(celery_id=request.request.id, details="Max Retries Exceeded", status="f")
result.save()
raise
result = Result(celery_id=request.request.id, details=xml, status="s")
result.save()
return result
不幸的是,MaxRetriesExceededError
没有被retry()
抛出,所以我不知道如何处理这种任务的失败。 Django已经将HTML返回给客户端,并且我正在通过AJAX检查Result
的内容,该AJAX永远不会完全失败f
状态。
所以问题是:当芹菜任务超过max_retries
时,如何更新我的数据库?
由于链接显然已经过时了,现在,[这里是一个新的](http://celery.readthedocs.org/en/latest/reference/celery.app.task.html?highlight=after_return#celery.app.task.Task.after_return) – rschwieb
谢谢,回答更新。 –