fix(celery): 优化PDF邮件任务配置并增强测试

调整Celery任务的retry和timeout配置,增加详细的日志记录
增强测试脚本的错误处理和诊断信息
This commit is contained in:
2026-01-19 21:58:26 +08:00
parent 83bbcd8ff7
commit e3c9d6f17d
2 changed files with 158 additions and 41 deletions

View File

@@ -359,47 +359,119 @@ def test_celery_redis_pdf_email():
try:
from core.tasks import celery_send_pdf_report_email
# 检查Celery worker状态
logger.info("检查Celery worker状态...")
from diary_family.celery import app
try:
# 检查worker是否运行
stats = app.control.inspect().stats()
if stats:
logger.info(f"✅ 找到 {len(stats)} 个运行中的worker")
else:
logger.warning("⚠️ 未找到运行中的worker任务可能无法执行")
logger.warning("请确保Celery worker正在运行: sudo supervisorctl status celery_worker")
except Exception as e:
logger.warning(f"⚠️ 检查worker状态失败: {e}")
# 发送PDF报告邮件任务
logger.info("发送Celery PDF报告邮件测试任务到Redis队列...")
task = celery_send_pdf_report_email.delay()
logger.info(f"PDF报告邮件测试任务已发送任务ID: {task.id}")
# 等待任务完成
logger.info("等待任务执行(最多60秒...")
result = task.get(timeout=60)
logger.info(f"PDF报告邮件任务执行结果: {result}")
# 检查结果状态
if result.get('status') == 'success':
logger.success("通过Celery和Redis发送包含PDF附件的邮件测试成功")
return True
else:
error_msg = result.get('error', '未知错误')
logger.error(f"包含PDF附件的邮件发送失败: {error_msg}")
logger.info("等待任务执行(最多120秒...")
try:
result = task.get(timeout=120)
logger.info(f"PDF报告邮件任务执行结果: {result}")
# 检查结果状态
if result.get('status') == 'success':
logger.success("✅ 通过Celery和Redis发送包含PDF附件的邮件测试成功")
return True
else:
error_msg = result.get('error', '未知错误')
logger.error(f"❌ 包含PDF附件的邮件发送失败: {error_msg}")
# 提供具体的解决方案
if "WeasyPrint" in error_msg:
logger.error("📄 WeasyPrint相关错误可能的原因:")
logger.error("1. WeasyPrint库未安装")
logger.error("2. WeasyPrint依赖项缺失")
logger.error("3. 权限问题导致无法生成PDF")
logger.error("解决方案: 运行 'pip install weasyprint' 安装WeasyPrint库")
elif "SMTP" in error_msg or "smtp" in error_msg:
logger.error("📧 SMTP相关错误可能的原因:")
logger.error("1. SMTP服务器地址或端口错误")
logger.error("2. SMTP用户名或密码错误")
logger.error("3. SMTP服务器不允许从当前IP地址连接")
logger.error("4. SMTP服务器超时")
elif "Redis" in error_msg or "redis" in error_msg:
logger.error("🔴 Redis相关错误可能的原因:")
logger.error("1. Redis服务未运行")
logger.error("2. Redis密码错误")
logger.error("3. Redis连接超时")
return False
except Exception as e:
error_msg = str(e)
logger.error(f"❌ 等待任务完成时发生错误: {error_msg}")
# 检查任务状态
try:
state = task.state
logger.info(f"任务当前状态: {state}")
if state == 'PENDING':
logger.error("🔴 任务仍处于待处理状态,可能的原因:")
logger.error("1. Celery worker未运行")
logger.error("2. 任务队列已满")
logger.error("3. Redis连接问题")
elif state == 'RETRY':
logger.error("🔄 任务正在重试,可能的原因:")
logger.error("1. 任务执行过程中发生错误")
logger.error("2. SMTP服务器临时不可用")
elif state == 'FAILURE':
logger.error("💥 任务执行失败,可能的原因:")
logger.error("1. 任务代码中存在错误")
logger.error("2. WeasyPrint库未正确安装")
logger.error("3. 邮件配置错误")
except Exception as state_e:
logger.error(f"获取任务状态失败: {state_e}")
# 提供具体的解决方案
if "WeasyPrint" in error_msg:
logger.error("📄 WeasyPrint相关错误,可能的原因:")
logger.error("1. WeasyPrint库未安装")
logger.error("2. WeasyPrint依赖项缺失")
logger.error("3. 权限问题导致无法生成PDF")
logger.error("解决方案: 运行 'pip install weasyprint' 安装WeasyPrint库")
if "timeout" in error_msg.lower():
logger.error("⏱️ 超时错误,可能的原因:")
logger.error("1. Celery worker未运行任务无法执行")
logger.error("2. 任务执行时间过长超过了120秒的超时限制")
logger.error("3. SMTP服务器响应缓慢")
logger.error("4. Redis连接超时")
# 检查系统资源
logger.error("请检查系统资源使用情况:")
logger.error(" sudo top -bn1 | head -20")
logger.error(" sudo systemctl status redis-server")
logger.error(" sudo supervisorctl status celery_worker")
return False
except Exception as e:
error_msg = str(e)
logger.error(f"通过Celery和Redis发送包含PDF附件的邮件测试失败: {error_msg}")
logger.error(f"通过Celery和Redis发送包含PDF附件的邮件测试失败: {error_msg}")
# 提供具体的解决方案
if "No such file or directory" in error_msg:
if "No module named" in error_msg:
module_name = error_msg.split("'"[1])
logger.error(f"📦 缺少模块: {module_name}")
logger.error(f"解决方案: 运行 'pip install {module_name}'")
elif "No such file or directory" in error_msg:
logger.error("📁 文件路径错误,可能的原因:")
logger.error("1. 报告目录不存在")
logger.error("2. 权限问题导致无法访问目录")
logger.error("3. 检查settings.py中的REPORTS_ROOT配置")
elif "Connection refused" in error_msg:
logger.error("🔌 连接被拒绝,可能的原因:")
logger.error("1. Celery worker未运行")
logger.error("2. Redis服务未运行")
logger.error("1. Redis服务未运行")
logger.error("2. Celery worker未运行")
logger.error("3. 防火墙阻止连接")
else:
logger.error("请检查:")
@@ -407,7 +479,8 @@ def test_celery_redis_pdf_email():
logger.error("2. Redis服务状态: sudo systemctl status redis-server")
logger.error("3. 系统配置中的邮件设置是否正确")
logger.error("4. SMTP服务器配置是否正确")
logger.error("5. WeasyPrint库是否已正确安装")
logger.error("5. WeasyPrint库是否已正确安装: pip show weasyprint")
logger.error("6. 检查Celery日志获取更多信息: sudo tail -f /var/log/celery/worker.log")
return False