Tôi đang cố gắng sử dụng dịch vụ web không đồng bộ vì mất tối đa 45 giây để trả lại. Thật không may, dịch vụ web này cũng phần nào không đáng tin cậy và có thể ném lỗi. Tôi đã thiết lập django-celery
và thực hiện các tác vụ của mình, hoạt động tốt cho đến khi tác vụ không thành công vượt quá max_retries
.Khôi phục từ tác vụ không thành công ngoài max_retries
Dưới đây là những gì tôi có cho đến nay:
@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
Thật không may, MaxRetriesExceededError
không được ném bởi retry()
, vì vậy tôi không chắc chắn làm thế nào để xử lý sự thất bại của nhiệm vụ này. Django đã trả lại HTML cho khách hàng và tôi đang kiểm tra nội dung của Result
qua AJAX, điều này không bao giờ bị lỗi đầy đủ trạng thái f
.
Vì vậy, câu hỏi đặt ra là: Làm cách nào để cập nhật cơ sở dữ liệu của tôi khi nhiệm vụ Celery vượt quá max_retries
?
Vì liên kết rõ ràng là lỗi thời bây giờ, [ở đây là một cái mới] (http://celery.readthedocs.org/en/latest/reference/celery.app.task.html?highlight=after_return#celery.app.task.Task.after_return) – rschwieb
Cảm ơn, câu trả lời đã được cập nhật. –