Я пытаюсь асинхронно использовать веб-службу, потому что для возврата требуется до 45 секунд. К сожалению, этот веб-сервис также несколько ненадежен и может вызывать ошибки. Я настроил django-celery
и выполнил мои задачи, который отлично работает, пока задача не завершится с ошибкой 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 клиенту, и я проверяю содержимое Result
через AJAX, который никогда не получает статус полного отказа f
.
Итак, вопрос: как я могу обновить свою базу данных, когда задача Сельдерея превысила max_retries
?