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.
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",)
Celery makes it easier to implement the task queues for many workers in a Django application.
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.
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)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With