SpringBoot 整合 XXL-JOB——分布式任务调度实战

📅 2026/7/5 3:36:43
SpringBoot 整合 XXL-JOB——分布式任务调度实战
Scheduled 在单机环境下够用但多实例部署时会遇到同一个任务每个机器都执行一遍的问题。XXL-JOB 是一个分布式任务调度平台提供可视化任务管理、执行日志、失败告警等能力是生产环境的主流选择。一、XXL-JOB 架构调度中心xxl-job-admin │ 调度任务 ↓ ├── 执行器 A任务1、任务2 ├── 执行器 B任务1、任务3 └── 执行器 C任务2、任务4核心概念调度中心管理任务配置、触发调度、查看日志执行器实际执行任务的应用程序任务具体的业务逻辑二、部署调度中心1. 下载源码gitclone https://github.com/xuxueli/xxl-job.git2. 初始化数据库-- 执行 xxl-job/doc/db/tables_xxl_job.sql-- 会创建 xxl_job 数据库及相关表3. 修改配置# xxl-job-admin/src/main/resources/application.propertiesserver.port8080 spring.datasource.urljdbc:mysql://localhost:3306/xxl_job?useUnicodetruecharacterEncodingutf-8spring.datasource.usernameroot spring.datasource.password123456# 登录账号xxl.job.login.usernameadmin xxl.job.login.password1234564. 启动mvn clean package-DskipTestsjava-jarxxl-job-admin/target/xxl-job-admin-2.4.0.jar访问http://localhost:8080/xxl-job-admin登录后即可看到管理界面。三、SpringBoot 集成执行器1. 引入依赖dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.4.0/version/dependency2. 配置xxl:job:admin:# 调度中心地址addresses:http://localhost:8080/xxl-job-adminexecutor:# 执行器名称appname:seckill-executor# 执行器端口port:9999# 执行器注册地址address:ip:logpath:/data/xxl-job/logslogretentiondays:30accessToken:# 调度中心通信 Token3. 配置类ConfigurationpublicclassXxlJobConfig{Value(${xxl.job.admin.addresses})privateStringadminAddresses;Value(${xxl.job.executor.appname})privateStringappname;Value(${xxl.job.executor.port})privateintport;BeanpublicXxlJobSpringExecutorxxlJobExecutor(){XxlJobSpringExecutorexecutornewXxlJobSpringExecutor();executor.setAdminAddresses(adminAddresses);executor.setAppname(appname);executor.setPort(port);executor.setLogPath(/data/xxl-job/logs);executor.setLogRetentionDays(30);returnexecutor;}}四、编写任务1. Bean 模式推荐ComponentpublicclassSeckillTasks{privatestaticfinalLoggerlogLoggerFactory.getLogger(SeckillTasks.class);/** * 超时未支付订单处理 */XxlJob(timeoutOrderHandler)publicReturnTStringtimeoutOrderHandler(Stringparam){log.info(开始处理超时未支付订单...);// 查询超时订单ListOrdertimeoutOrdersorderService.list(newLambdaQueryWrapperOrder().eq(Order::getStatus,0).lt(Order::getCreateTime,LocalDateTime.now().minusMinutes(10)));for(Orderorder:timeoutOrders){// 取消订单order.setStatus(2);orderService.updateById(order);// 归还库存productService.restoreStock(order.getProductId(),order.getQuantity());}log.info(处理完成共取消 {} 笔订单,timeoutOrders.size());returnReturnT.SUCCESS;}/** * 每日数据统计 */XxlJob(dailyReport)publicReturnTStringdailyReport(Stringparam){log.info(生成日报表...);// 报表生成逻辑returnReturnT.SUCCESS;}}2. 分片广播模式多机器协作适合大数据量处理把数据分给多个执行器并行处理XxlJob(shardingJob)publicReturnTStringshardingJob(Stringparam){// 获取当前执行器的分片信息ShardingUtil.ShardingVOshardingVOShardingUtil.getShardingVo();intindexshardingVO.getIndex();// 当前执行器编号从0开始inttotalshardingVO.getTotal();// 执行器总数// 查询所有需要处理的数据ListLonguserIdsgetAllUserIds();// 只处理分配给自己的那部分for(intiindex;iuserIds.size();itotal){processUser(userIds.get(i));}log.info(分片 {}/{} 处理完成处理 {} 条,index1,total,userIds.size()/total);returnReturnT.SUCCESS;}五、在管理台配置任务登录调度中心 → 执行器管理 → 新增执行器AppName: seckill-executor 名称: 秒杀系统执行器 注册方式: 自动注册任务管理 → 新增任务执行器: seckill-executor 任务描述: 超时订单处理 调度类型: cron Cron: 0 */1 * * * ? ← 每分钟执行一次 运行模式: Bean JobHandler: timeoutOrderHandler六、任务参数传递XxlJob(paramJob)publicReturnTStringparamJob(Stringparam){// param 是在调度中心配置任务时填写的参数log.info(接收参数: {},param);if(StringUtils.isNotBlank(param)){JSONObjectjsonJSONObject.parseObject(param);Stringdatejson.getString(date);intlimitjson.getInteger(limit);// 使用参数执行任务}returnReturnT.SUCCESS;}在调度中心的任务配置中填入 JSON 参数{date:2026-07-03,limit:1000}七、任务执行日志XxlJob(logJob)publicReturnTStringlogJob(Stringparam){XxlJobLogger.log(任务开始执行...);try{// 业务逻辑XxlJobLogger.log(处理第 1 批数据共 100 条);Thread.sleep(1000);XxlJobLogger.log(处理第 2 批数据共 100 条);Thread.sleep(1000);XxlJobLogger.log(任务执行完成);returnReturnT.SUCCESS;}catch(Exceptione){XxlJobLogger.log(任务执行失败: {},e.getMessage());returnReturnT.FAIL;}}在调度中心可以实时查看每台机器上的任务执行日志。八、Scheduled vs Quartz vs XXL-JOB对比ScheduledQuartzXXL-JOB部署内嵌内嵌调度中心 执行器分离可视化❌❌✅ 管理界面分布式❌ 每个实例都执行❌ 需自己实现✅ 天然支持失败告警❌❌✅ 邮件告警动态修改❌ 改代码重启❌✅ 在线修改适用场景简单单机任务复杂调度逻辑生产环境分布式九、秒杀系统集成建议每天零点 → 清理过期活动数据 → 日清理任务 每分钟 → 检查超时未支付订单 → 超时订单处理 每月1号 → 生成月度报表 → 月报任务 大促后 → 数据归档 → 归档任务分片广播建议项目初期用 Scheduled 快速实现等系统上线稳定后再迁移到 XXL-JOB。 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。