Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrying tasks with Django-Celery - Django/Celery

Tags:

I'm having problems retrying tasks, here is what a test task looks like

from celery.decorators import task  @task() def add(x, y):     if not x or not y:         raise Exception("test error")     return x+y 

I cannot find any documentation what-so-ever on how to retry decorated tasks, all I found was this:

self.retry(x,y, exc=exception, countdown=30) 

which doesn't seem to work with my case as there is not self variable being passed from the method.

Edit:

I'm trying the following now to no avail:

from celery.decorators import task  @task() def add(x, y):     if not x or not y:         try:             raise Exception("test error")         except Exception, e:             add.retry([x, y], exc=e, countdown=30)     return x+y 

I get the following error:

TypeError("kwargs argument to retries can't be empty. Task must accept **kwargs, see http://bit.ly/cAx3Bg",)

like image 246
RadiantHex Avatar asked Feb 01 '11 15:02

RadiantHex


People also ask

Should I use celery with Django?

Celery makes it easier to implement the task queues for many workers in a Django application.

How do I register a task on celery?

Register a task in the task registry. The task will be automatically instantiated if not already an instance. Name must be configured prior to registration. Unregister task by name.


2 Answers

You can set your retry parameters in the decorator:

@task(default_retry_delay=5 * 60, max_retries=12) def foo(bar):   try:       ...   except Exception, exc:       raise foo.retry(exc=exc) 
like image 199
dalore Avatar answered Oct 03 '22 00:10

dalore


The task needs to accept keyword arguments, they are used to pass information amongst other about the retry count. I think the code should look like this:

from celery.decorators import task  @task() def add(x, y, **kwargs):     if not x or not y:         try:             raise Exception("test error")         except Exception, e:             add.retry(args=[x, y], exc=e, countdown=30, kwargs=kwargs)     return x+y 

**kwargs need to be added to the signature of the add function, and passed as kwargs=kwargs when calling retry.

Note: this style was deprecated with the release of celery 2.2.

like image 33
Reiner Gerecke Avatar answered Oct 03 '22 00:10

Reiner Gerecke