【发布时间】:2019-07-28 10:44:00
【问题描述】:
如果第一次没有成功,我有一个 celery shared_task 设置最多重试 10 次。初始日志语句只执行一次。没有任何异常被引发,嵌入的try/else也没有。语句 result = LdapHostGroupView().start(data, username, version) 确实执行了,它从日志条目中显示它成功,但最终的 else 永远不会执行。
这是怎么回事?
@shared_task(bind=True, default_retry_delay=15, max_retry=10)
def host_accepted(self, data, username, version):
from .api.views import LdapHostGroupView
name = data.get('name', '')
version = Decimal(version)
log.debug("name: %s, version: %s, version type: %s, data: %s",
name, version, type(version), data)
try:
obj = Transaction.objects.get(endpoint_name=name)
except Transaction.DoesNotExist as e:
msg = "Could not find transaction '{}'".format(name)
log.critical(msg)
syslog.critical(msg)
else:
try:
result = LdapHostGroupView().start(data, username, version)
except RealmBundleDoesNotExist as e:
log.debug("Bundle does not exist yet.")
obj.job_summary += str(e) + '\n'
obj.job_status = Transaction.INPROGRESS
obj.save()
self.retry(exc=e) # ** self.request.retries)
except (RealmCriticalException, ValidationError) as e:
error = e.get_full_details()
log.debug("Host Accepted error: %s", error)
if isinstance(error, dict):
for field, values in error.items():
for value in values:
ed = value.get('message')
if isinstance(ed, ErrorDetail):
item = str(ed)
else:
item = value
msg = "Field '{}' has error: {}\n".format(field, item)
obj.job_summary += msg
else:
obj.job_summary += "Had error with no message.\n"
obj.job_status = Transaction.FAILURE
obj.save()
else:
log.info("Celery task 'host_accepted' executed at %s, "
"returned %s, incoming data %s",
datetime.now(tzutc()).isoformat(), result, data)
# Check the result object.
obj.job_status = Transaction.SUCCESS
obj.save()
在 Django 视图中是这样调用的:
host_accepted.delay(request.data, request.user.username, request.version)
【问题讨论】:
标签: django python-3.x django-rest-framework celery-task