我一直在使用 Celery 和 Django,一切都很好,除非我需要重试失败的任务。
它引发异常并且不再发送任务(根据我在 Celery Flower 中看到的)
这是我宣布任务的方式
# Enqueue this on "my_cool_queue", retry it no more than ten times and delay the retries by 10 seconds
@celery.task(queue='my_cool_queue', max_retries=10, default_retry_delay=10)
def task(arg1, arg2):
try:
# do some things with arg2 and arg2
except suds.WebFault, fault:
task.retry(exc=fault, args=[arg1, arg2], queue='my_cool_queue')
我正在用这个命令运行 celery
python manage.py celeryd --concurrency=2 -B -Q my_cool_queue,cron -l INFO
我有两个队列,my_cool_queue 放置所有用户生成的任务和 cron,放置所有计划任务。
我错过了什么??
编辑:
调试一点 celery 的重试方法,我发现它没有重试任务,因为它接收到默认上下文,该上下文在 True 中具有“called_directly”参数
因此,此方法的前几行如下:
# Not in worker or emulated by (apply/always_eager),
# so just raise the original exception.
if request.called_directly:
maybe_reraise() # raise orig stack if PyErr_Occurred
raise exc or RetryTaskError('Task can be retried', None)
问题可能是“我怎样才能以一种优雅的方式改变它”,所以我不必直接在任务上写:
task.request.called_directly = False
非常感谢您提前。