Estoy intentando consumir un servicio web de forma asíncrona, ya que demora hasta 45 segundos en volver. Desafortunadamente, este servicio web también es poco confiable y puede generar errores. Configuré django-celery
y tengo la ejecución de mis tareas, que funciona bien hasta que la tarea falla más allá de max_retries
.Falló la recuperación de la tarea más allá de max_retries
Esto es lo que tengo hasta ahora:
@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
Desafortunadamente, MaxRetriesExceededError
no está siendo lanzada por retry()
, así que no estoy seguro de cómo manejar el fracaso de esta tarea. Django ya ha devuelto HTML al cliente, y estoy verificando el contenido de Result
a través de AJAX, que nunca llega a un estado de falla total f
.
Entonces la pregunta es: ¿Cómo puedo actualizar mi base de datos cuando la tarea de Apio ha excedido max_retries
?
Desde el enlace al parecer es obsoleto en la actualidad, [aquí es una nueva] (http://celery.readthedocs.org/en/latest/reference/celery.app.task.html?highlight=after_return#celery.app.task.Task.after_return) – rschwieb
Gracias, respuesta actualizada. –