如何覆盖send_task BaseTask类?

时间:2012-11-02 03:22:16

标签: python rabbitmq celery

我做了某种迷你框架,以便能够在celery关闭的情况下捕获与rabbitmq的连接错误,以更优雅的方式处理错误,并且除了使用{{{ 1}}。

以下是一些澄清这个想法的代码:

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

并且当发生套接字错误时它将执行safe_failover函数(AKA,当class MyL33tTask(MyBaseTask): name = 'task.my_leet_task' def run(self, *args, **kwargs): # yada yada 关闭时)。遗憾的是,当我使用rabbitmq时,这并没有发生,因为它使用了某种代理,其中send_task('task.my_leet_task')未被加载。

是否可以轻松覆盖MyBaseTask以使用send_task

1 个答案:

答案 0 :(得分:0)

我完全了解您的逻辑的主要用途是确保您实际向代理发送任务。

如果我的理解是正确的,那么你的方法可能是错误的,让我解释一下原因。 使用消息传递时,主要的优点是你可以通过将消息传递给代理来安排任务,方法send_task实际上他对任务本身一无所知它只是为Celery编写一个格式良好的消息并且它发送它到配置的代理(http://docs.celeryproject.org/en/latest/faq.html#can-i-call-a-task-by-name)。

考虑到这一点,很明显,在你调用* send_message *时应该处理异常捕获“发送消息失败”。 延迟方法可以保持这种方式,但我建议更明确,并保持捕获逻辑,你实际上调用delay(),因为再次如果没有安排任务该怎么办不是由任务决定,而是由达到调度器。