定时任务并发重试治理
status: complete
created: 2026-07-19
complexity: 🟡中等
parent: code-copilot/changes/定时任务优化/spec.md
version: V4
dependency: 定时任务可靠性加固;ONCE Misfire 依赖定时任务一次性与时区
ui-baseline: code-copilot/changes/定时任务优化/ui-reference.md
1. 目标
为存在重复执行和临时故障风险的任务增加明确、受控、可审计的执行策略。本版本只处理执行策略,不建设告警、监控或开放 API。
2. 功能范围
3. 明确不做
- 不提供第三种没有独立语义的 Misfire 策略。
- 不自动判断业务代码是否幂等。
- 不发送站内信、邮件或 Webhook 告警。
- 不建设监控大盘、开放 API 或批量治理。
4. 数据变更
| 表 |
字段 |
说明 |
| sys_job_config |
concurrent_policy |
ALLOW/SKIP_IF_RUNNING |
| sys_job_config |
misfire_policy |
FIRE_ONCE_NOW/DO_NOTHING |
| sys_job_config |
idempotent_flag |
是否允许自动重试 |
| sys_job_log |
scheduled_fire_time |
原计划时间 |
| sys_job_log |
fire_instance_id |
Quartz 执行实例 |
| sys_job_log |
retry_count |
实际重试次数 |
继续复用现有 retry_count 配置字段,不增加第二套重试次数字段。
5. 执行规则
- 手动触发和计划触发都遵循并发策略。
- 跳过必须形成日志,状态为已跳过,不能伪装成功。
- retry_count 大于 0 且 idempotent_flag 不为 1 时拒绝保存。
- Misfire 只影响计划 Trigger,不影响手动触发。
- 每次重试不得重复创建新的顶层执行记录。
6. 验收标准
- 双实例竞争同一任务时,SKIP_IF_RUNNING 只有一个进入业务执行。
- ALLOW 策略允许并行执行。
- Redis 故障时禁止无锁执行受保护任务。
- 非幂等任务无法开启自动重试。
- 两类 Misfire 在固定时钟测试下符合 Quartz 实际行为。
7. 确认门禁
8. 实施结论
- V4 功能、数据迁移、前端配置和日志展示已完成。
- Job 模块 84/84、前端定向测试 13/13、定向 ESLint、前端生产构建和 Admin 42 模块聚合构建通过。
- Mapper XML、Flyway placeholder、Service 查询规范、冲突标记和
git diff --check 通过。
- 真实 MySQL Flyway 执行和真实 Redis 多实例竞争保留为部署环境验收项。