## 任务目标
在当前 Java 工程中完成定时或异步业务任务,交付处理逻辑、可靠记录与恢复机制;业务确需等待结果、查看进度或重试时,再接入已有 Vue 页面。不额外搭建调度运维控制台。沿用工程的框架、权限、数据访问和组件规范,完成授权范围内开发及隔离测试。
## 输入信息(选填)
两项均可留空,也可只填一句话目标;未替换的占位内容或含义不清的输入按缺失处理。
- 任务目标:
- 工程与规则资料:
## 信息不完整时
先检查目录与未提交改动,定位构建依赖、调度入口、执行器、消费者、任务记录、业务表、权限和 Vue 调用链。读取必要配置,避免输出凭据。区分事实、推断和待确认规则,不重复索取工程中已有的信息。
技术选型跟随现有路径;简单可重复计算任务不强加中间件。缺容量依据时保留配置入口,用隔离测试的小样本验证功能,不把示例参数写成推荐吞吐配置。缺业务身份、处理范围、触发周期、重复执行后果或第三方调用规则,只暂停依赖这些规则的自动触发与副作用;继续完成任务拆解、输入校验、状态契约、可独立实现的代码和替身测试,并集中列出最少的阻塞问题。
没有工程时,基于已知业务交付最小代码文件集、状态与接口约定、隔离配置及测试;未知业务操作使用明确拒绝执行的适配入口,不能空实现后返回成功。未获得授权,不执行真实批量任务、发送通知或调用会改变第三方状态的接口。
## 执行要求
1. 确定业务边界与执行路径。识别触发来源、处理对象、授权主体、最终成功条件和重复执行代价。按已有 Spring 调度、执行器、MQ 或 XXL-JOB 选择方案。说明本地 `@Scheduled`、`@Async` 不天然提供跨实例唯一执行、持久队列或可靠投递;调度成功、入队成功、方法返回与业务完成分别处理,不能承诺“恰好一次”。轻量可重算任务说明可接受的丢失范围。
2. 明确时间与重叠语义。核对当前组件版本的 cron 格式、时区与触发算法,列出下一组实际触发时间,不能混用 Linux、Spring、Quartz 表达式。区分固定频率与完成后间隔;同步调度转交异步后,提交方法返回不等于任务结束,须按业务范围另控重叠。明确跨日、月末、闰日、夏令时跳时与重复时刻的处理,保存可区分时刻的时间值及业务时区。按业务选跳过、合并一次或补齐漏触发,限定补齐窗口和处理顺序;本地调度不自动补偿停机期间业务,不能启动即无界补跑。XXL-JOB 仅在已用时核对过期、阻塞与重试策略,不能把覆盖之前调度当作旧任务已经停止。
3. 建立最小任务模型。区分任务定义、一次逻辑任务的 taskId、每次尝试的 attemptId,以及业务幂等键;业务时间窗口或批次使用稳定标识,重试更换尝试标识而不更换应去重的业务标识。按需记录来源、可信租户、操作主体、参数版本或快照、计划时间、状态、尝试次数、下次可执行时间、结果与必要游标。复用现有表和审计能力,避免为简单任务机械拆表。参数变化后重跑须明确是原任务恢复还是新任务;不能用一个“执行中”布尔值表达全部生命周期。
4. 配置有边界的执行资源。检查实际 Executor Bean、线程命名、队列、并发限制和拒绝处理,避免共享池被长任务占满;不得循环创建线程池或无界堆积任务。线程、批量、连接、队列、超时与第三方配额共同约束,参数依据现有数据和测量确定。拒绝必须反馈为未接受或可恢复等待,不能静默丢弃后显示已提交;采用调用线程执行策略前检查它是否拖慢请求、阻塞调度或改变事务上下文。异步异常必须进入可查询结果,不能仅依赖日志;任务之间等待不得占满同一执行池形成死锁。
5. 验证代理、事务与上下文。确认调用经过当前版本支持的 Spring 代理,避免同类自调用导致异步或事务失效;不要仅添加注解就宣称生效。调用方线程事务不会自然传给异步线程,按业务单元显式开启处理事务,核对异常回滚规则和吞异常路径。长批次分段提交并记录已完成项,避免持有数据库事务等待远程响应。租户、操作者和关联标识从可信入口持久化必要快照,工作线程重新建立并在 finally 中恢复或清理上下文;不复制请求对象、数据库连接或任意客户端传入租户标识。执行时按业务规则复核权限变化,系统任务使用受限系统身份。
6. 消除提交与投递之间的丢失窗口。仅提交后触发才能避免读取未提交数据,但 `AFTER_COMMIT` 或内存事件不自动解决提交后进程退出、提交成功而入队失败。需要可靠执行时,在同一业务事务记录任务意图或 outbox,再由可恢复分发器领取、投递并记录结果;已用事务事件登记机制则验证其持久化与重投条件,不重复造轮子。提交后监听器若写数据库须建立有效的新事务,不能假定原事务还能提交。MQ 结合实际组件核对确认、重投、顺序范围和消费提交时机;业务与消费记录原子提交后再确认,处理提交成功但确认丢失造成的重复,不把数据库提交和消息发送说成天然原子。
7. 处理多实例争抢与租约失效。以数据库原子条件更新、唯一约束或已有协调机制领取任务,领取成功必须检查影响行数;按任务或业务对象选择互斥范围,不能默认全局串行。租约按已知耗时设置可配置期限,续租、释放与完成回写都校验所有者和当前尝试版本。TTL 到期、续租失败或进程暂停后旧 worker 仍可能继续运行;业务写入须在受保护资源侧原子检查所有权版本或 fencing token,单次“写前查锁”仍有竞态。Redis 锁只按匹配持有者原子释放,不能直接删除他人锁;随机解锁标识不等于单调隔离令牌。外部接口不支持隔离或幂等时,明确无法据此阻止旧执行者副作用,限制自动接管并提供结果核对路径。
8. 让幂等落到业务数据。根据租户、业务对象、操作类型和必要时间窗口设计唯一约束或原子状态转换,将成功效果与处理记录放入可保证原子的事务边界。不能以“先查询不存在再插入”、内存集合或分布式锁代替数据库最终约束。捕获唯一冲突后核对参数与原结果,相同键不同请求必须报冲突;尚未完成或结果未知不能返回伪造成功。分片、批次恢复按项目稳定键处理,禁止重试时重建全部成功数据;已有 Util、枚举与数据库字典按职责复用,未知状态保留原值并明确显示。
9. 限制重试、取消和超时。区分临时失败、永久业务拒绝和结果未知,设置可配置的有界次数、退避、抖动与下次尝试时间,避免在线程里长时间睡眠。调度器、消费端和业务层重试只能形成一套可解释的总预算,防止叠加放大。远程超时先按业务幂等键查询结果或核对回执,不能默认失败并重发。取消是请求,超时是观测状态,线程中断也不证明副作用停止;在安全点检查取消信号,处理已提交与未处理部分,并在获得完成证据后确认终态。取消与完成竞争采用原子状态条件处理,不能覆盖真实成功记录。
10. 恢复真实状态与进度。先定义状态转换及允许操作者,再按实际需要表达待执行、执行中、等待重试、成功、失败、取消中、已取消、部分完成或结果待确认,避免为展示增加无业务含义的状态。进度来自持久化成功、失败、跳过与待处理数量,明确总量未知及分批统计口径,不能用计时器伪造百分比。恢复依据记录、租约、业务结果和重试策略,不因心跳过期直接判定业务失败;旧尝试晚到的回写不得覆盖新尝试结果。返回结果前核对业务数据,失败信息脱敏并保留可定位的任务标识。
11. 按需完成 Vue 业务交互。复用现有详情页、列表或操作反馈区,只展示用户关心的处理状态、更新时间、真实结果和有权限的重试或取消操作。状态查询、任务创建、结果下载和操作接口都在后端检查主体、租户与对象权限,不能仅靠按钮隐藏;参数不可成为任意 Bean、脚本、SQL 或外部地址执行入口。接口返回稳定任务标识,提交后刷新仍可查询;轮询使用已有节奏并防止请求重叠,终态或离开页面停止,旧响应不能覆盖新状态。网络断开、未知状态、部分失败和重复点击有明确反馈;重试范围与代价说明清楚。中文布局规整克制,不添加虚构统计、装饰大屏或开发术语堆砌。
12. 完成源码与有证据的验证。提供实际修改的 Java、配置、DTO、Mapper、SQL XML、迁移与必要 Vue 文件,沿用现有目录、校验、异常和日志规范,不留省略号充当完整实现。MyBatis SQL 写入 XML,禁止在 Java 注解、Provider 或字符串拼装 SQL;动态值绑定,动态标识符走固定白名单。新增表及全部字段给出详细注释,说明含义、状态取值、时间单位、空值和关联约束;索引与迁移采用实际数据库语法。测试覆盖代理实际生效、事务回滚不投递、提交后未投递可恢复、重复触发与唯一冲突、多实例争抢、旧租约执行者回写及副作用防护、超时未知结果、取消竞态、部分失败恢复和权限隔离。以可控时钟、同步屏障和故障注入构造隔离场景,不能用长时间等待凑测试,也不能仅 mock 掉数据库后证明原子性。按所选技术运行必要的真实数据库或消息集成测试;未采用的中间件不增加无关测试。
## 交付与验收
先说明实现范围和实际技术路径,再给完整文件清单、改动、配置含义、任务状态转换及接口示例;如新增数据结构,交付可审阅的迁移文件与字段注释。说明哪些业务结果可恢复、可去重,哪些外部结果仍需核对。
给出完整命令及执行目录:依赖准备、数据库变更、Java 与按需 Vue 启动、隔离样例触发、结果查询和测试;标明前置条件与配置来源,不执行未授权真实副作用。
验收须关联同一任务及尝试标识,核对业务数据库结果、执行记录、接口和按需页面。提交成功不等于任务完成;失败、部分完成和未知结果均有可核对记录。提供本次实际执行的编译、测试、集成检查和页面验证结果,列出失败与未执行原因。没有真实环境只交付已完成代码和隔离验证,不声称跨实例可靠性、吞吐或未来生成代码已实测通过;不能只给方案后结束已授权开发。
## 参考资料与适用边界
以下公开官方资料于 2026-09-08 核验。正文是结合业务任务开发整理的原创执行要求,不是公司内部规范、大厂认证或现成代码的实测证明;具体 API 与行为以当前工程版本为准。
- [Spring:任务执行与调度](https://docs.spring.io/spring-framework/reference/integration/scheduling.html):核验调度、异步代理、执行器及异常边界。
- [Spring:事务绑定事件](https://docs.spring.io/spring-framework/reference/data-access/transaction/event.html):核验事务阶段与监听条件,不等于可靠投递。
- [Spring:声明式事务](https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html):核验代理与回滚规则,按实际事务管理器验证。
- [Spring Modulith:应用事件](https://docs.spring.io/spring-modulith/reference/events.html):核验事件丢失、发布记录与重投;仅适用已有组件。
- [XXL-JOB:官方文档](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3.md):核验过期、阻塞、重试与超时;不等于业务恰好一次。
- [Redis:分布式锁](https://redis.io/docs/latest/develop/clients/patterns/distributed-locks/):核验持有者释放、租约与隔离令牌;不要求新增 Redis。