主要更新: - 修复了所有主要的代码逻辑错误 - 实现了完整的任务清理系统 - 添加了系统设置页面的任务清理管理功能 - 修复了API调用认证问题 - 优化了密码加密和验证机制 - 统一了错误处理模式 - 添加了详细的文档和测试工具 新增功能: - 任务清理管理界面 - 任务归档和清理日志 - API监控和诊断工具 - 完整的测试套件 技术改进: - 修复了Repository方法调用错误 - 统一了模型方法调用 - 改进了类型安全性 - 优化了代码结构和可维护性
4.2 KiB
4.2 KiB
轮询查询功能实现说明
概述
系统已实现每2分钟执行一次的轮询查询功能,用于检查任务状态并更新完成/失败状态。
实现组件
1. 定时任务服务
TaskStatusPollingService.java
- 功能: 每2分钟轮询查询任务状态
- 注解:
@Scheduled(fixedRate = 120000)(2分钟 = 120000毫秒) - 方法:
pollTaskStatuses() - 功能:
- 查找需要轮询的任务
- 调用外部API查询状态
- 更新任务状态(完成/失败/处理中)
- 处理超时任务
TaskQueueScheduler.java
- 功能: 任务队列调度器
- 注解:
@Scheduled(fixedRate = 120000)(2分钟) - 方法:
checkTaskStatuses() - 功能:
- 检查队列中的任务状态
- 调用TaskQueueService.checkTaskStatuses()
PollingQueryService.java
- 功能: 专门的轮询查询服务
- 注解:
@Scheduled(fixedRate = 120000)(2分钟) - 方法:
executePollingQuery() - 功能:
- 查询所有正在处理的任务
- 逐个检查任务状态
- 提供统计信息
2. 核心服务
TaskQueueService.java
- 方法:
checkTaskStatuses()- 检查队列中的任务状态 - 方法:
checkTaskStatus(TaskQueue)- 检查单个任务状态 - 功能:
- 查询外部API获取任务状态
- 更新任务状态(完成/失败/超时)
- 处理积分扣除和返还
3. 配置类
PollingConfig.java
- 功能: 轮询查询配置
- 特性:
- 启用定时任务
@EnableScheduling - 自定义线程池执行定时任务
- 确保每2分钟精确执行
- 启用定时任务
4. 测试控制器
PollingTestController.java
- 路径:
/api/polling/** - 接口:
GET /api/polling/stats- 获取轮询统计信息POST /api/polling/trigger- 手动触发轮询查询GET /api/polling/config- 获取轮询配置信息
轮询查询流程
1. 定时触发
每2分钟 → TaskStatusPollingService.pollTaskStatuses()
每2分钟 → TaskQueueScheduler.checkTaskStatuses()
每2分钟 → PollingQueryService.executePollingQuery()
2. 查询逻辑
1. 查找需要轮询的任务
2. 调用外部API查询状态
3. 解析响应数据
4. 更新任务状态
5. 处理超时任务
6. 记录日志
3. 状态更新
- 完成:
completed或success→ 扣除积分,创建用户作品 - 失败:
failed或error→ 返还积分,记录错误 - 处理中:
processing或pending→ 继续等待 - 超时: 超过时间限制 → 标记为超时,返还积分
配置参数
定时任务间隔
- 固定间隔: 120000毫秒 = 2分钟
- 注解:
@Scheduled(fixedRate = 120000) - 线程池: 2个线程执行定时任务
外部API配置
- 基础URL:
http://116.62.4.26:8081 - API密钥:
ak_5f13ec469e6047d5b8155c3cc91350e2 - 超时设置: 无限制(0秒)
日志记录
轮询查询日志
=== 开始执行任务状态轮询查询 (每2分钟) ===
找到 X 个需要轮询查询的任务
轮询任务: taskId=xxx, externalTaskId=xxx, status=xxx
外部API响应: {...}
任务状态更新: taskId=xxx, status=xxx, resultUrl=xxx
=== 任务状态轮询查询完成 ===
状态更新日志
任务完成: taskId=xxx
任务失败: taskId=xxx, 错误: xxx
任务继续处理中: taskId=xxx, 状态: xxx
任务超时: taskId=xxx
测试接口
获取统计信息
GET /api/polling/stats
手动触发轮询
POST /api/polling/trigger
获取配置信息
GET /api/polling/config
注意事项
- 定时任务启用: 确保主应用类有
@EnableScheduling注解 - 线程安全: 使用事务管理确保数据一致性
- 错误处理: 单个任务失败不影响其他任务轮询
- 超时处理: 自动处理超时任务,返还用户积分
- 日志记录: 详细记录轮询过程和状态变化
总结
轮询查询功能已完整实现,包括:
- ✅ 每2分钟自动轮询查询
- ✅ 外部API状态查询
- ✅ 任务状态更新
- ✅ 积分管理
- ✅ 超时处理
- ✅ 详细日志记录
- ✅ 测试接口
- ✅ 统计信息
系统将自动每2分钟执行一次轮询查询,检查所有正在处理的任务状态,并更新相应的完成/失败状态。