fix(celery): 优化PDF邮件任务配置并增强测试
调整Celery任务的retry和timeout配置,增加详细的日志记录 增强测试脚本的错误处理和诊断信息
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user