bd359411a923061618f6b924aad2a2ffd2455cb2
2026-09-18 任务 28587(跟价,uid 977 店铺「张美莺」)在客户端 09:51/09:57 被更新脚本 重启后中断,任务一直挂 RUNNING 到 stale 兜底;跟价循环还有第二重问题——子任务失败 即整个循环判 FAILED,一次客户端更新就让无限循环彻底停下。 契约:中断任务**保留失败记录**(用户看得到「因客户端重启中断」),同时由服务端自动 重新排队续跑,长任务不再因为一次更新整个白跑。 - V129:biz_file_task 加 resume_of_task_id / resume_attempt, biz_price_track_loop_run 加 resume_attempt(代数封顶用); - 新增 TaskResumeService:扫描最近 30 分钟内因客户端中断而失败、未续跑过、代数未超限的 任务,复制请求参数重新排队成 PENDING,交给已有兜底拉取通道(客户端每分钟 pull-pending) 领走执行——不新造第二套派发机制。只对注册了 ClientTaskPullSpi 的模块生效 (相似ASIN/采集/外观专利),上架/改价等写操作模块刻意排除,避免盲目重跑; - 幂等:按 resume_of_task_id 反查,同一原任务不会重复排队; - 挂在 stale-check 巡检线(每 2 分钟、有分布式锁),并用隔离壳包住异常: 续跑失败绝不拖垮判死主流程(判死优先级更高); - PriceTrackLoopRunService:子任务因「客户端异常中断」失败时不终止循环, 清 active_task_id 后保持 RUNNING,客户端下次 dispatchNext 拿到同一店铺/同一轮, 即原地续跑(页内已处理 ASIN 由服务端 skip_asins 去重,不会重复改价); 连续重派超过 3 次才真正判失败,避免会话持续不可用时无限重开浏览器 (28587 就是这样白烧了 5 小时)。子任务成功一轮后计数归零; - application.yml:aiimage.task-resume.enabled 默认跟随 client-task-pull 开关 (兜底拉取关着时续跑任务无人领取,只会积压被告死)。 测试:TaskResumeServiceTest 6 例(排队/幂等/开关/无实现/插入失败/无归属用户)、 PriceTrackLoopRunServiceTest 新增 4 例(中断续跑/达上限/非中断仍终止/成功归零), 连带更新 DeleteBrandStaleTaskServiceTest 与 TaskModuleCoverageTest 的构造参数。
Description
No description provided
Languages
Java
70.7%
TypeScript
16.7%
Vue
11.8%
Python
0.5%
JavaScript
0.2%
Other
0.1%