XXL-Job 分布式定时任务框架完整详解
目录一、整体概述1. 定位2. 核心优势对应你提到的能力二、架构原理核心流程1. 组件分工2. 完整调度流程三、核心能力详解重点防重复、分片、重试、日志告警一分布式多实例防重复执行最核心痛点传统定时任务缺陷XXL-Job 两种防重复方案方案 1调度中心统一单点下发天然防重复方案 2分片广播多实例并行但分片隔离不会重复处理数据补充兜底业务层幂等二分片任务大数据批量处理神器适用场景分片原理代码示例SpringBoot优势三失败重试机制补充任务阻塞策略防止重试堆积雪崩四日志体系 多渠道告警1. 完整执行日志2. 多渠道告警四、快速集成SpringBoot 最简示例1. Maven 依赖2. 配置文件 application.yml3. 执行器配置类4. 自定义任务 Handler五、调度中心部署要点六、适用场景与对比适用场景和其他定时框架对比七、生产环境注意事项一、整体概述1. 定位XXL-JOB 是国内开源轻量级分布式定时任务调度平台核心解决传统定时任务痛点单机定时任务无法水平扩容集群部署多实例会重复执行任务无统一可视化管理界面任务启停、日志、执行记录难以排查缺少分片广播、失败重试、告警、任务路由、阻塞策略企业级能力原生支持 Java / Python / Shell / Go 等多语言执行器开箱即用。核心架构分为两大模块调度中心Admin统一管理任务、触发调度、存储日志、告警、可视化后台执行器Executor业务服务内嵌接收调度指令、执行业务逻辑、上报执行结果。2. 核心优势对应你提到的能力分布式防重复执行调度中心统一下发调度信号同一时刻仅分发一次提供多种路由策略避免多实例并发执行分片任务大数据量场景分片并行处理提升数据同步、批处理效率失败重试支持任务执行失败自动重试、手动重试、失败死信记录完整日志 告警实时执行日志在线查看邮件 / 钉钉 / 企业微信 / 短信多渠道告警 额外企业特性任务阻塞策略、动态启停、定时 CRON、延迟任务、任务依赖、权限管理。二、架构原理核心流程1. 组件分工调度中心Admin数据库存储任务配置、执行记录、日志、告警配置、执行器注册信息定时触发器基于 Quartz 实现 CRON 定时无锁分布式调度注册中心执行器启动后自动注册心跳Admin 维护在线执行器实例列表调度逻辑到达触发时间根据路由策略挑选执行器HTTP RPC 下发执行指令结果收集接收执行器上报的执行状态、日志、耗时持久化入库告警模块任务超时、执行失败触发告警推送。执行器Executor业务服务集成心跳上报定时向 Admin 上报在线状态、服务 IP 端口任务处理器XxlJobHandler自定义业务任务任务执行线程池隔离不同任务支持阻塞策略处理任务堆积日志收集本地内存 文件日志Admin 在线拉取查看回调上报任务执行完成 / 异常同步返回执行结果给调度中心。2. 完整调度流程业务服务启动XXL-Job 执行器自动注册到调度中心维持 30s 心跳Admin 后台配置任务CRON 表达式、路由策略、重试次数、分片参数、告警规则定时时间到达Admin 查询当前在线执行器列表根据路由策略选中目标执行器HTTP 请求下发执行参数分片 ID、任务参数等执行器匹配对应XxlJobHandler新开线程执行业务代码执行中实时输出日志执行完成后将执行状态、返回信息、异常堆栈回调给 AdminAdmin 入库执行记录若失败则按配置重试失败次数耗尽触发告警推送。三、核心能力详解重点防重复、分片、重试、日志告警一分布式多实例防重复执行最核心痛点传统定时任务缺陷SpringScheduled本地定时多服务集群部署时每台机器独立触发同一时间点所有实例同时跑任务造成数据重复处理、数据库重复更新、数据错乱。XXL-Job 两种防重复方案方案 1调度中心统一单点下发天然防重复调度中心是统一调度入口定时信号只由 Admin 产生一次再分发到执行器不会出现多实例自主触发。 搭配路由策略精准控制执行范围轮询按顺序分配给在线执行器每次只一台执行随机随机选一台执行单实例运行一致性 HASH相同任务参数固定分配同一台机器最少活跃选择当前任务负载最低的实例以上 4 种路由同一任务同一时间仅一台执行器运行彻底杜绝重复执行。方案 2分片广播多实例并行但分片隔离不会重复处理数据路由策略选择「分片广播」时所有在线执行器都会执行但通过分片参数隔离数据每台机器只处理自己分片的数据不会重复。补充兜底业务层幂等框架层面只能保证调度只下发一次若网络超时、执行器响应丢失Admin 可能重试下发业务代码必须实现幂等唯一业务主键、状态位判断双重保障。二分片任务大数据批量处理神器适用场景百万级数据同步、订单批量统计、数据库全量清洗、文件分片解析单台机器处理太慢需要集群并行加速。分片原理当路由策略 分片广播Admin 获取当前在线执行器总数shardTotal分片总数给每一台执行器分配唯一分片序号shardIndex从 0 开始所有执行器同时执行业务内根据分片编号过滤数据WHERE id % shardTotal shardIndex每台机器只处理属于自己分片的数据数据互不重叠。代码示例SpringBootjavaXxlJob(dataSyncHandler) public void dataSyncHandler() { // 获取分片参数 ShardingUtil.ShardingVO sharding ShardingUtil.getShardingVo(); int shardIndex sharding.getIndex(); // 当前机器分片号 int shardTotal sharding.getTotal(); // 集群总分片数 // 分片查询数据避免重复 ListOrder orderList orderMapper.selectByShard(shardIndex, shardTotal); for (Order order : orderList) { // 业务处理 } }优势横向扩容执行器实例分片总数自动增加自动分摊数据无需手动修改分片配置。三失败重试机制支持三层重试配置灵活应对网络波动、临时数据库超时等瞬时异常任务内重试代码层业务自定义捕获异常循环重试框架自动重试后台配置配置参数失败重试次数、重试间隔秒逻辑任务执行抛出异常 → Admin 标记失败等待间隔后重新下发任务限制重试次数耗尽后不再自动重试记录失败日志并触发告警手动重试后台执行记录页面任意历史失败任务一键重新触发。补充任务阻塞策略防止重试堆积雪崩当上一次任务未执行完成下一次调度时间到达提供 5 种策略避免任务堆积串行执行等待上一轮结束再执行丢弃后续任务放弃本次调度覆盖之前任务终止正在运行的任务执行新调度只执行一次忽略堆积仅保留最新一次禁止并发同一任务同一时间只能存在一个运行实例。四日志体系 多渠道告警1. 完整执行日志实时在线日志后台页面实时滚动查看无需登录服务器查日志文件日志持久化执行摘要存入 MySQL详细运行日志本地文件存储支持按任务 ID、时间检索日志参数支持自定义打印业务参数、异常堆栈定位失败原因日志清理策略后台配置自动清理 N 天前日志避免磁盘溢出。2. 多渠道告警触发条件任务执行失败、任务执行超时、执行器离线失联。 支持推送渠道钉钉机器人、企业微信机器人邮件告警短信告警对接第三方短信平台Webhook 自定义回调对接自研运维平台。 可单独配置每个任务是否开启告警支持告警屏蔽时间段如夜间低优先级任务关闭短信。四、快速集成SpringBoot 最简示例1. Maven 依赖xmldependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId version2.4.1/version /dependency2. 配置文件 application.ymlyamlxxl: job: admin: addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心地址 executor: appname: business-executor # 执行器名称后台创建执行器对应 ip: # 自动获取本机IP无需填写 port: 9999 # 执行器通讯端口单机多服务需不同端口 logpath: /data/xxl-job/logs # 本地日志路径 logretentiondays: 7 # 日志保留7天 accessToken: default_token # 调度中心与执行器通信密钥保持一致3. 执行器配置类javaConfiguration public class XxlJobConfig { Value(${xxl.job.admin.addresses}) private String adminAddresses; Value(${xxl.job.executor.appname}) private String appName; Value(${xxl.job.executor.port}) private int port; Value(${xxl.job.accessToken}) private String accessToken; Value(${xxl.job.executor.logpath}) private String logPath; Value(${xxl.job.executor.logretentiondays}) private int logRetentionDays; Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor executor new XxlJobSpringExecutor(); executor.setAdminAddresses(adminAddresses); executor.setAppname(appName); executor.setPort(port); executor.setAccessToken(accessToken); executor.setLogPath(logPath); executor.setLogRetentionDays(logRetentionDays); return executor; } }4. 自定义任务 HandlerjavaComponent public class TaskHandler { // 简单定时任务单实例执行 XxlJob(simpleTask) public void simpleTask() { XxlJobHelper.log(简单任务开始执行); // 业务逻辑 XxlJobHelper.log(任务执行完成); } // 分片并行任务 XxlJob(shardTask) public void shardTask() { ShardingUtil.ShardingVO shard ShardingUtil.getShardingVo(); XxlJobHelper.log(分片号:{},总分片:{}, shard.getIndex(), shard.getTotal()); // 分片业务处理 } }五、调度中心部署要点调度中心支持集群部署多 Admin 实例通过 MySQL 分布式锁保证同一时间仅一台 Admin 触发调度不会重复下发内置 MySQL 脚本初始化任务表、执行日志表、告警表后台功能任务 CRUD、CRON 生成器、执行记录查询、日志查看、告警配置、执行器管理、用户权限支持容器 Docker 一键部署适配云原生 K8s 环境。六、适用场景与对比适用场景分布式微服务定时任务需要避免多实例重复执行大批量数据批处理需要分片并行提升效率需要统一后台管理、可视化日志、失败自动告警多语言混合技术栈Java、Shell、Python 脚本定时执行。和其他定时框架对比Spring Scheduled轻量无中间件不支持分布式、分片、告警集群重复执行Quartz原生支持分布式但无可视化后台分片、告警需要自行封装Elastic-Job分片能力更强但架构重依赖 Zookeeper运维成本高XXL-Job轻量、零依赖注册中心仅依赖 MySQL、开箱即用中小企业首选。七、生产环境注意事项幂等必做框架只能保证调度下发一次网络重试仍可能重复执行业务增加唯一主键、状态判断长耗时任务合理配置任务超时时间、阻塞策略防止线程池打满分片数据均衡分片 SQL 避免数据倾斜超大表建立分片索引调度中心集群生产环境部署多台 Admin提升调度高可用日志磁盘规划配置合理日志保留天数定时清理避免磁盘占满告警分级核心业务开启短信告警普通日志仅钉钉通知避免告警轰炸。