XXL-Job 的 5 个坑:任务重复执行、执行器掉线、分片广播失效、超时被中断、日志丢失
定时任务是那种上线就忘的功能——写完往那一挂直到某天凌晨告警炸了才想起来还有这东西。我项目里用 XXL-Job 跑数据同步、报表统计、库存对账这类活。踩过的坑攒了一堆挑 5 个最典型的讲每一个都是静默故障不看告警根本发现不了。坑 1任务重复执行——集群部署后同一个任务跑了两遍现象本地单机测试一切正常上线集群后对账任务每晚跑重复了两次数据库多出一倍数据。原因这里有个常见误解——很多人以为 XXL-Job 会自动帮你去重其实要看触发方式。XXL-Job 的调度中心通过DB 锁保证一次调度只触发一次执行这是它的第 22 条特性。但这句话有个前提走的是调度中心的调度。如果执行器是手动触发、GLUE 里自己起了线程、或者业务代码里又调了一次同一个任务DB 锁就管不着了。还有一种常见情况路由策略选了分片广播或轮询但任务本身没做幂等—— 广播模式下每个执行器都会跑一次如果任务写的是全局数据不是按分片参数分区处理就是 N 台机器重复写同一份数据。解决分两层防。第一层任务本身必须幂等——这是最根本的。定时任务和消息消费一样永远假设自己会被执行不止一次XxlJob(dailyReconcile)publicvoiddailyReconcile(){StringbizDateXxlJobHelper.getJobParam();// 业务日期从参数拿别用 now()if(StringUtils.isBlank(bizDate)){bizDateLocalDate.now().minusDays(1).toString();}// 幂等前置检查这一天已经跑过就跳过if(reconcileRecordMapper.existsByDate(bizDate)){XxlJobHelper.log({} 已完成对账跳过,bizDate);return;}doReconcile(bizDate);reconcileRecordMapper.save(bizDate);}关键点任务参数里传业务日期不要在任务内部用LocalDate.now()。否则重复执行时会按今天重算一遍幂等检查也拦不住。第二层用 DB 唯一索引兜底CREATETABLEt_reconcile_record(idBIGINTPRIMARYKEYAUTO_INCREMENT,biz_dateDATENOTNULL,create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,UNIQUEKEYuk_biz_date(biz_date)-- 重复插入直接报错跑不进去第二次);应用层幂等检查 数据库唯一索引双保险。只靠应用层检查是不够的——两个执行器同时跑到检查那一步、都发现没跑过然后都往下执行这就是并发漏洞。坑 2执行器掉线——任务状态一直是运行中现象某台执行器容器被 OOM Kill 重启那个正在跑的任务在调度中心一直显示运行中再也不会被重新调度。原因XXL-Job 有故障转移Failover特性——路由策略选它某台执行器挂了会自动切到正常的。但故障转移的前提是调度时刻发现机器不可用。已经在跑的任务如果执行器突然死了任务状态会卡在运行中直到超时时间到了才会被标记失败。如果任务的超时时间设成了0不限制那这个任务可能永远卡在那后续调度被阻塞处理策略判定为正在运行而跳过。解决三条一起上。① 一定要设超时时间别用 0// 在调度中心的任务配置里设置超时时间比如 30 分钟// 超时后调度中心会主动中断任务并把状态置为失败② 阻塞处理策略选对默认是单机串行排队等上一次跑完另外两个选项是丢弃后续调度和覆盖之前调度。对账这类任务建议用丢弃后续调度——堆积没意义等下一次调度就好。③ 注册方式用自动注册手填执行器地址xxl.job.executor.address在容器化环境里是灾难——Pod 一重建 IP 就变了。让执行器周期性自动上报调度中心自动发现xxl:job:executor:appname:order-executor# 不写 address让执行器自动注册容器/云环境必做ip:port:9999logpath:/data/applogs/xxl-job/jobhandlerlogretentiondays:30accessToken:${XXL_JOB_TOKEN}坑 3分片广播用错了——数据被处理了 4 遍现象给数据同步任务配了分片广播路由策略4 台执行器想着能并行加速。结果每台机器都把全量数据同步了一遍4 倍压力打到数据库。原因分片广播不是自动帮你切数据它只是把分片参数告诉你。每台执行器拿到的是我是第几片、一共几片具体怎么分数据要靠你自己写。XXL-Job 的机制是分片广播以执行器为维度分片一次调度广播触发集群中所有执行器执行一次通过分片参数支持开发分片任务这是它的第 13、14 条特性。没写分片逻辑 每个执行器跑全量。解决任务内部必须按分片参数过滤数据XxlJob(syncProduct)publicvoidsyncProduct(){// 取当前执行器的分片序号和总分片数intshardIndexXxlJobHelper.getShardIndex();intshardTotalXxlJobHelper.getShardTotal();// 关键按 id 取模分片每个执行器只处理属于自己那份ListProductproductsproductMapper.selectByShard(shardIndex,shardTotal);for(Productproduct:products){doSync(product);}XxlJobHelper.log(分片 {}/{} 完成处理 {} 条,shardIndex,shardTotal,products.size());}!-- 按 id 取模分片每台机器只捞自己那份 --selectidselectByShardresultTypeProductSELECT*FROMt_productWHEREMOD(id,#{shardTotal}) #{shardIndex}/select收益4 台机器并行理论提速 4 倍。代价是必须确保分片规则稳定——如果中途有一台执行器下线分片总数从 4 变成 3取模结果全变了同一批数据可能被两台机器分别处理。所以分片任务的幂等要求比单机任务更高。坑 4任务超时被中断但业务代码还在跑现象设了 5 分钟超时任务被调度中心标记为超时失败并触发了重试。但被中断的那次执行实际上还在后台跑着和重试的那次撞在一起数据乱了。原因XXL-Job 的超时中断是通过线程 interrupt 实现的。如果业务代码里有循环、等待、IO 阻塞这类不响应中断的操作interrupt只是设了个标志位代码该跑还是跑。解决业务代码要主动响应中断——在长循环里检查中断状态XxlJob(batchImport)publicvoidbatchImport(){ListFilefileslistPendingFiles();for(Filefile:files){// 每个文件开始处理前检查是否被要求中断if(Thread.currentThread().isInterrupted()){XxlJobHelper.log(收到中断信号已完成 {}/{}安全退出,processed,files.size());return;}importFile(file);processed;}}更稳的做法给任务设计断点续传能力——记录已处理到的位置下次启动从中断处继续而不是从头再来。// 每次处理完一批就落一次进度progressMapper.save(newProgress(batchImport,processed,files.size()));配合坑 1 的幂等表被中断的任务重跑时能自动跳过已处理部分。超时中断 断点续传 幂等这三个一起用才安全。坑 5日志看不见——出问题只能靠猜现象任务失败了调度中心点执行日志只看到一句Handler error和一堆框架堆栈看不到业务执行到哪一步。原因很多人习惯用log.info()打日志。XXL-Job 的执行日志在调度中心页面上看的那个必须用XxlJobHelper.log()log.info打的内容在执行器的本地日志文件里不在调度中心页面上。而且要注意调度中心只保留最近 30 天的日志logretentiondays配置排查陈年问题得去执行器本地看。解决关键节点全部用XxlJobHelper.log()让调度中心页面能自解释XxlJob(dailyReport)publicvoiddailyReport(){XxlJobHelper.log(开始生成日报日期{},bizDate);try{ListOrderordersorderMapper.selectByDate(bizDate);XxlJobHelper.log(查出订单 {} 条,orders.size());reportService.generate(bizDate,orders);XxlJobHelper.log(日报生成完成);}catch(Exceptione){// 异常必须打日志再抛否则页面上什么都看不到XxlJobHelper.log(日报生成失败: {},e.getMessage());XxlJobHelper.log(e);throwe;// 抛出去让调度中心标记为失败才能触发重试和告警}}关键认知异常要打日志 抛出。只打日志不抛调度中心认为任务成功不会重试也不会告警——这是最隐蔽的坑任务明明失败了但你永远收不到通知。总结坑本质解决1 重复执行任务不幂等 / 分片任务写全局数据业务日期从参数传 唯一索引兜底2 执行器掉线卡运行中没设超时任务永远卡住设超时时间 “丢弃后续调度” 自动注册3 分片广播失效只拿参数不写分片逻辑getShardIndex/TotalMOD(id, total)分片4 超时中断但代码还在跑interrupt 不被响应循环里检查isInterrupted() 断点续传5 日志看不见用了log.info而非XxlJobHelper.log关键节点用XxlJobHelper.log异常打日志后抛出核心心法定时任务的设计原则只有一条——假设它会被执行 0 次、1 次或 N 次。0 次要有兜底扫描比如每天检查有没有漏跑的任务N 次要幂等。围绕这条原则设计上面 5 个坑基本都能提前避开。你们项目用的什么调度框架踩过重复执行或者分片失效吗评论区聊聊。如果这篇帮你避开凌晨三点被叫醒转给组里维护定时任务的同事。「今天写BUG了么」关注看更多

相关新闻

迭代器模式从入门到落地:解耦遍历与数据结构

迭代器模式从入门到落地:解耦遍历与数据结构

每次聊到设计模式,总会有人问:迭代器模式这么基础,不就是个for循环吗,有什么好学的?说实话,我刚开始接触 23 种设计模式的时候也是这个想法。直到有一次,我在重构一个内部报表系统时&#xff0c…

2026/10/18 4:50:35 阅读更多 →
Java 雪花算法 ID 重复排查:workerId 配错,两台机器生成了一样的 ID(附源码)

Java 雪花算法 ID 重复排查:workerId 配错,两台机器生成了一样的 ID(附源码)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 4:50:34 阅读更多 →
达梦DSC共享存储集群:从架构原理到运维实战

达梦DSC共享存储集群:从架构原理到运维实战

1. 为什么选择DSC:共享存储集群的定位与适用场景做数据库运维这些年,我接触过的集群方案不少,从最早的主备切换、读写分离,到后来的分布式中间件,各有各的适用场景。DSC集群在达梦的体系里,对应的是Shared …

2026/10/18 4:50:34 阅读更多 →

最新新闻

Kyber实战指南:从格密码原理到后量子密钥封装与迁移

Kyber实战指南:从格密码原理到后量子密钥封装与迁移

如果你最近在评估加密组件,大概率已经注意到 Kyber 这个名字频繁出现。它是一种基于格的量子安全加密机制,核心能力是密钥封装(KEM),也就是让通信双方各自拿到一份相同的共享密钥,再用这份密钥去驱动后续的…

2026/10/18 18:24:57 阅读更多 →
AI论文生成工具实战指南:四类工具分阶段配合,告别低效写作

AI论文生成工具实战指南:四类工具分阶段配合,告别低效写作

先说结论:AI写论文确实厉害,但厉害在“帮你把散掉的想法收敛成结构”,而不是“替你从头编一篇”。我见过不少同学第一次接触AI论文生成工具时,都抱着“输入题目、一键出稿、直接交差”的心态,结果下载回来的东西往往是…

2026/10/18 18:24:57 阅读更多 →
GRE隧道从入门到实战:原理、配置与常见问题排查

GRE隧道从入门到实战:原理、配置与常见问题排查

1. 从一个真实需求说起:为什么还要折腾GRE隧道第一次接触GRE隧道是在一个跨机房互联的项目里。当时手头有两套环境,一套跑着核心业务,另一套是新建的测试集群,两边分属不同的网段,中间隔着好几层路由设备。最直接的想法…

2026/10/18 18:24:57 阅读更多 →
专科毕设实战:工程技术人员考评系统设计与实现

专科毕设实战:工程技术人员考评系统设计与实现

简介:本资源是一份面向专科计算机专业学生的毕业论文《工程技术人员考评系统设计与实现》,聚焦企业人力资源管理中科技人才评价的数字化转型需求,为初学者提供完整的Web应用型信息系统设计范例。论文涵盖系统数据建模、需求分析、三层架构设计…

2026/10/18 18:24:57 阅读更多 →
开源推理模型LongCat-Flash-Thinking-2601全解析:部署实战与避坑指南

开源推理模型LongCat-Flash-Thinking-2601全解析:部署实战与避坑指南

这两年推理模型几乎把AI圈子的热度重新点了一遍,前脚一堆带“Thinking”后缀的长思维链模型扎堆开源,后脚就有人把内部代号“龙猫”的项目LongCat-Flash-Thinking-2601放了出来。第一时间拉了权重、翻完仓库、跑了几轮benchmark,还在两种不同…

2026/10/18 18:24:57 阅读更多 →
用AI辅助开题报告写作:从选题到成稿的四层实战工作流

用AI辅助开题报告写作:从选题到成稿的四层实战工作流

深夜十一点,电脑前摊着导师三天前批回来的开题报告初稿,红笔批注比正文还长。最扎眼的那句写着:"你的研究意义写得太空,文献综述像课程作业,方法部分看不出你到底要怎么做。"屏幕的光映在脸上,脑…

2026/10/18 18:23:57 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →