我正在使用Redis代理和数据库结果后端运行Django Celery,这是我用于主应用程序的Postgres数据库。
最近我遇到了Postgres服务器重启并且工作进程丢失数据库连接的情况。在这种情况发生之后,即使DB恢复并且主Django站点正常响应,也没有芹菜任务再次成功。我需要在处理任何内容之前重新启动celeryd进程。所有芹菜任务都报告相同的错误:
DatabaseError: terminating connection due to administrator command
SSL connection has been closed unexpectedly
据我所知,当使用db结果后端Celery无法报告失败时,外部看起来这些任务从未执行但我不明白后续任务失败的原因。 Celery文档说它不会在任务之间保持DB连接,因此新任务应该建立新连接。
那么,为什么会发生这种情况呢?数据库连接是否存在较低级别的持久性?我怎样才能让芹菜重试这些任务?
答案 0 :(得分:3)
我通过在所有celery任务中添加一个after_return处理程序来解决这个问题,以便在每次执行后关闭数据库连接。
http://docs.celeryproject.org/en/latest/userguide/tasks.html#abstract-classes
class DBTask(celery.Task):
abstract = True
def after_return(self, *args, **kwargs):
connection.close()
@celery.task(base=DBTask)
def mytask():
# Do Stuff with DB