Celery v0.8.1 (stable) documentation

This Page

Retrying Tasks

Retrying a task if something fails

Simply use celery.task.base.Task.retry() to re-sent the task, it will do the right thing, and respect the celery.task.base.Task.max_retries attribute:

class SendTwitterStatusTask(Task):

    def run(self, oauth, tweet, **kwargs):
        try:
            twitter = Twitter(oauth)
            twitter.update_status(tweet)
        except (Twitter.FailWhaleError, Twitter.LoginError), exc:
            self.retry(args=[oauth, tweet], exc=exc, **kwargs)

Here we used the exc argument to pass the current exception to celery.task.base.Task.retry(). At each step of the retry this exception is available as the tombstone (result) of the task, when celery.task.base.Task.max_retries has been exceeded this is the exception raised. However, if an exc argument is not provided the celery.task.base.RetryTaskError exception is raised instead.

Setting a custom delay for retries.

The default countdown is in the tasks celery.task.base.Task.default_retry_delay attribute, which by default is set to 3 minutes.

You can also provide the countdown argument to celery.task.base.Task.retry() to override this default.

class MyTask(Task):
    default_retry_delay = 30 * 60 # retry in 30 minutes

    def run(self, x, y, **kwargs):
        try:
            ...
        except Exception, exc:
            self.retry([x, y], exc=exc,
                       countdown=60 # override the default and
                                    # retry in 1 minute
                       **kwargs)