瀏覽代碼

Implements new task_retry signal. Closes #1169

Ask Solem 12 年之前
父節點
當前提交
075674a20f
共有 3 個文件被更改,包括 18 次插入4 次删除
  1. 9 0
      celery/exceptions.py
  2. 3 0
      celery/signals.py
  3. 6 4
      celery/task/trace.py

+ 9 - 0
celery/exceptions.py

@@ -65,6 +65,15 @@ class MaxRetriesExceededError(Exception):
 class RetryTaskError(Exception):
     """The task is to be retried later."""
 
+    #: Optional message describing context of retry.
+    message = None
+
+    #: Exception (if any) that caused the retry to happen.
+    exc = None
+
+    #: Time of retry (ETA), either int or :class:`~datetime.datetime`.
+    when = None
+
     def __init__(self, message=None, exc=None, when=None, **kwargs):
         from kombu.utils.encoding import safe_repr
         self.message = message

+ 3 - 0
celery/signals.py

@@ -23,6 +23,9 @@ task_postrun = Signal(providing_args=[
     'task_id', 'task', 'args', 'kwargs', 'retval',
 ])
 task_success = Signal(providing_args=['result'])
+task_retry = Signal(providing_args=[
+    'request', 'reason', 'einfo',
+])
 task_failure = Signal(providing_args=[
     'task_id', 'exception', 'args', 'kwargs', 'traceback', 'einfo',
 ])

+ 6 - 4
celery/task/trace.py

@@ -82,11 +82,13 @@ class TraceInfo(object):
         req = task.request
         type_, _, tb = sys.exc_info()
         try:
-            pred = self.retval
-            einfo = ExceptionInfo((type_, pred, tb))
+            reason = self.retval
+            einfo = ExceptionInfo((type_, reason, tb))
             if store_errors:
-                task.backend.mark_as_retry(req.id, pred.exc, einfo.traceback)
-            task.on_retry(pred.exc, req.id, req.args, req.kwargs, einfo)
+                task.backend.mark_as_retry(req.id, reason.exc, einfo.traceback)
+            task.on_retry(reason.exc, req.id, req.args, req.kwargs, einfo)
+            signals.task_retry.send(sender=task, request=req,
+                                    reason=reason, einfo=einfo)
             return einfo
         finally:
             del(tb)