Rabbitmq 芹菜:连接错误时中止任务

Rabbitmq 芹菜:连接错误时中止任务,rabbitmq,celery,Rabbitmq,Celery,我必须实现一个任务子类,如果代理没有运行,它将正常失败——目前我使用的是RabbitMQ。 我可以使用try语句捕获异常: 试试看: Mytask.delay(arg1、arg2) 除socket.error外: #向管理员发送通知 通过 但是我想创建一个Task的子类来处理这个问题。 我试过这样的方法: 类MyTask(任务): 忽略结果=真 定义调用(self,*args,**kwargs): 尝试: 返回self.run(*args,**kwargs) 除socket.error外: #

我必须实现一个任务子类,如果代理没有运行,它将正常失败——目前我使用的是RabbitMQ。 我可以使用try语句捕获异常:

试试看:
Mytask.delay(arg1、arg2)
除socket.error外:
#向管理员发送通知
通过
但是我想创建一个Task的子类来处理这个问题。 我试过这样的方法:

类MyTask(任务):
忽略结果=真
定义调用(self,*args,**kwargs):
尝试:
返回self.run(*args,**kwargs)
除socket.error外:
#向管理员发送通知
一无所获
但工作流程显然是错误的。我想我需要注入一个后端子类或者一个失败策略。 你有什么建议吗?

我想出了一个可能的解决方案:

导入套接字
从芹菜.decorators导入任务
来自芹菜。任务导入任务
从芹菜.backends.base导入BaseBackend
未送达='未送达'
类DummyBackend(BaseBackend):
"""
未传递消息的虚拟队列后端(由于代理已关闭)。
"""
def存储结果(自身、*args、**kwargs):
通过
def get_状态(自身、*args、**kwargs):
未送达的退货
def_假人(自身、*args、**kwargs):
一无所获
等待=获取结果=获取回溯=\u虚拟
类安全任务(任务):
"""
如果代理关闭,则不会引发套接字错误的任务。
"""
抽象=真
在代理上\u错误=无
errbackend=DummyBackend
@类方法
def应用异步(cls、*ARG、**kwargs):
尝试:
返回super(SafeTask,cls)。应用异步(*args,**kwargs)
除socket.error外,错误:
如果cls.on\U broker\U错误不是无:
cls.on_broker_错误(错误、cls、*args、**kwargs)
返回cls.app.AsyncResult(无,后端=cls.errbackend(),
任务(名称=cls.name)
def安全任务(*args,**kwargs):
"""
任务工厂返回处理套接字错误的安全任务。
当发生套接字错误时,给定的可调用*on_broker_错误*
调用传递异常对象,即任务的类
还有原始的args和kwargs。
"""
如果“基准”不在kwargs中:
on-broker\u error=kwargs.pop('on-broker\u error',SafeTask.on-broker\u error)
errbackend=kwargs.pop('errbackend',SafeTask.errbackend)
kwargs['base']=类型('SafeTask',(SafeTask,){
'on_broker_error':staticmethod(on_broker_error),
'errbackend':errbackend,
"摘要":对,,
})
返回任务(*args,**kwargs)
您既可以将SafeTask子类化,也可以使用decorator@SafeTask。 如果你能想出一个改进的办法,不要犹豫做出贡献