I have to implement a Task subclass that gracefully fails if the broker is not running – currently I’m using RabbitMQ.
I could probably just use a try statement to catch the exception:
try:
Mytask.delay(arg1, arg2)
except socket.error:
# Send an notice to an admin
pass
but I’d like to create a subclass of Task that can handle that.
I’ve tried something like that:
class MyTask(Task):
ignore_result = True
def __call__(self, *args, **kwargs):
try:
return self.run(*args, **kwargs)
except socket.error:
# Send an notice to an admin
return None
but the workflow is clearly wrong. I think I need to inject maybe a backend subclass or a failure policy somehow.
Do you have any suggestion?
A possible solution I came up with:
You can both subclass SafeTask or use the decorator @safetask.
If you can think of an improvement, don’t hesitate to contribute.