我做了某种迷你框架,以便能够在以更优雅的方式处理错误的celery
情况下捕获连接错误,并且除了使用.rabbitmq
send_task
这是一些代码来阐明这个想法:
class MyBaseTask(base_task.Task):
""" Base Class to handle tasks from Me hohoho!"""
abstract = True
@classmethod
def delay(cls, *args, **kwargs):
"""Hook to catch connection errors"""
try:
return super(MyBaseTask, cls).apply_async(args, kwargs)
except socket.error as e:
cls._safe_failover() # a function to handle this error
cls.get_logger().error(str(e))
except Exception as e:
cls.get_logger().error("Uknown Error: %s" % str(e))
raise # normal exception
现在我继承MyBaseTask
类:
class MyL33tTask(MyBaseTask):
name = 'task.my_leet_task'
def run(self, *args, **kwargs):
# yada yada
当套接字错误发生时(AKA,当关闭时),它将执行 safe_failover 函数rabbitmq
。可悲的是,当我使用它时不会发生这种情况,send_task('task.my_leet_task')
因为它使用了某种MyBaseTask
未加载的代理。
有没有一种简单的方法可以替代send_task
使用MyBaseTask
?