返されるまでに最大 45 秒かかるため、Web サービスを非同期で使用しようとしています。残念ながら、この Web サービスも信頼性が低く、エラーをスローする可能性があります。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()
ていないため、このタスクの失敗を処理する方法がわかりません。Result
Django は既に HTML をクライアントに返しています。AJAX 経由でコンテンツをチェックしていますが、完全な失敗f
状態になることはありません。
問題は、Celery タスクが超過したときにデータベースを更新するにはどうすればよいかということmax_retries
です。