偶尔重新启动postgres时,由于OperationalError
s,我从Celery那里得到了大量错误。比如:
File "/var/www/.virtualenvs/xxx/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
OperationalError: terminating connection due to administrator command
SSL connection has been closed unexpectedly
有没有办法自动重启任何以这种方式结束的芹菜任务,可能有30秒延迟或什么?我正在使用redis作为我的经纪人。
我可以在我的任务中发现这种错误,但这意味着在try / except中包装每个数据库命令,这将是一种可怕的。
答案 0 :(得分:1)
芹菜Preview of Main Report任务失败。您可以将延迟配置为任务级别的默认值,如果需要,还可以基于每个例外进行配置。
@app.task(bind=True, default_retry_delay=30) # retry in 30 seconds.
def add(self, x, y):
try:
something_risky()
except Exception as exc:
# overrides the default delay to retry after 1 minute
raise self.retry(exc=exc, countdown=60)
如果您只想重试OperationalError
(或其他特定错误),您可以指定
@app.task(autoretry_for=(OperationalError,))
还可以通过retry_backoff
参数内置对supports retrying的支持,这可能对您的情况有用。
@app.task(autoretry_for=(OperationalError,), retry_backoff=True)