2012-11-02 43 views
3

我做了一些迷你的框架,以便能夠在的情況下捕捉連接錯誤,以防rabbitmq關閉,以更優雅的方式處理錯誤,除非使用send_task,否則它工作得很好。如何覆蓋send_task BaseTask類?

下面是一些代碼釐清思路:

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 

,並在套接字錯誤發生(又名它將執行safe_failover功能,當rabbitmq正在下降)。可悲的是,當我使用send_task('task.my_leet_task')時,不會發生這種情況,因爲它使用某種代理,其中MyBaseTask未加載。

有沒有簡單的方法來覆蓋send_task使用MyBaseTask而不是?

回答

0

我已經知道你的邏輯的主要用途是確保你實際上將任務發送給經紀人。

如果我的理解是正確的,那麼你的方法可能是錯誤的,讓我解釋一下爲什麼。 當使用消息傳遞時,主要優點是可以通過向代理傳遞消息來安排任務,send_task方法實際上並不知道任務本身的任何內容,它只是爲Celery組成一個格式良好的消息,並且它發送它到配置的代理(http://docs.celeryproject.org/en/latest/faq.html#can-i-call-a-task-by-name)。

考慮到這一點,很明顯應該在你調用* send_message *的地方處理異常捕獲「發送消息失敗」。 延遲方法可能會停留在那種方式,但我會建議更明確,並保持捕獲邏輯實際調用delay(),因爲如果任務未被調度,該怎麼辦還不能達到任務,調度程序。