我有一个Celery服务器和一个RabbitMQ代理。我用它来运行Django项目中的后台任务。
在我的一个视图中,一个信号被触发,然后调用一个celery 任务,如下所示:
create_something.delay(pk)
任务的定义如下:
@task
def create_something(donation_pk):
# do something
一切都很好,但是:
如果RabbitMQ在我调用任务时关闭,则在create_something.delay(pk)调用期间不会抛出错误。但该视图抛出了这个错误:
[Errno 111] Connection refused
(The堆栈跟踪是一种无用的,我认为这是因为使用的信号)
现在的问题是:我如何防止这种错误?当代理关闭时,是否有可能执行create_something.delay(pk)的重试?
提前感谢任何提示!
2条答案
按热度按时间s5a0g9ez1#
Celery tasks有一个
.run()
方法,它将执行任务,因为它是正常代码流的一部分。您可以捕获异常并在需要时执行
.run()
。ryoqjall2#
当代理关闭时,是否有可能执行create_something.delay(pk)的重试?
当您调用
.delay()
方法并且无法连接时抛出的异常可以像任何其他异常一样被捕获:你可以围绕这个构建一个循环来重试,但是你应该注意不要让请求保持很长时间。例如,如果连接问题需要整整一秒钟才能得到解决,那么您不希望将请求延迟整整一秒钟。这里的一个选项可能是快速中止,但使用日志基础设施,以便向站点管理员发送电子邮件。一旦我确定了导致连接问题的原因,并且我确定它无法帮助,重试循环将是我做的最后一件事。在大多数情况下,它 * 可以 * 是有帮助的,重试循环实际上是一个创可贴解决方案。
我如何防止这种错误?
确保你的经纪人不会倒下。为了得到更准确的答案,你必须在问题中提供给予更多的诊断信息。
顺便说一下,Celery有一个重试任务的概念,但这是当任务 * 已经 * 为代理所知时。它不适用于您无法联系经纪人的情况。