尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

SpringBoot 整合 XXL-JOB——分布式任务调度实战
📅 发布时间:2026/7/5 3:38:35

@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.git

2. 初始化数据库

-- 执行 xxl-job/doc/db/tables_xxl_job.sql-- 会创建 xxl_job 数据库及相关表

3. 修改配置

# xxl-job-admin/src/main/resources/application.propertiesserver.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=utf-8spring.datasource.username=root spring.datasource.password=123456# 登录账号xxl.job.login.username=admin xxl.job.login.password=123456

4. 启动

mvn clean package-DskipTestsjava-jarxxl-job-admin/target/xxl-job-admin-2.4.0.jar

访问http://localhost:8080/xxl-job-admin,登录后即可看到管理界面。

三、SpringBoot 集成执行器

1. 引入依赖

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version></dependency>

2. 配置

xxl:job:admin:# 调度中心地址addresses:http://localhost:8080/xxl-job-adminexecutor:# 执行器名称appname:seckill-executor# 执行器端口port:9999# 执行器注册地址address:""ip:""logpath:/data/xxl-job/logslogretentiondays:30accessToken:# 调度中心通信 Token

3. 配置类

@ConfigurationpublicclassXxlJobConfig{@Value("${xxl.job.admin.addresses}")privateStringadminAddresses;@Value("${xxl.job.executor.appname}")privateStringappname;@Value("${xxl.job.executor.port}")privateintport;@BeanpublicXxlJobSpringExecutorxxlJobExecutor(){XxlJobSpringExecutorexecutor=newXxlJobSpringExecutor();executor.setAdminAddresses(adminAddresses);executor.setAppname(appname);executor.setPort(port);executor.setLogPath("/data/xxl-job/logs");executor.setLogRetentionDays(30);returnexecutor;}}

四、编写任务

1. Bean 模式(推荐)

@ComponentpublicclassSeckillTasks{privatestaticfinalLoggerlog=LoggerFactory.getLogger(SeckillTasks.class);/** * 超时未支付订单处理 */@XxlJob("timeoutOrderHandler")publicReturnT<String>timeoutOrderHandler(Stringparam){log.info("开始处理超时未支付订单...");// 查询超时订单List<Order>timeoutOrders=orderService.list(newLambdaQueryWrapper<Order>().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")publicReturnT<String>dailyReport(Stringparam){log.info("生成日报表...");// 报表生成逻辑returnReturnT.SUCCESS;}}

2. 分片广播模式(多机器协作)

适合大数据量处理,把数据分给多个执行器并行处理:

@XxlJob("shardingJob")publicReturnT<String>shardingJob(Stringparam){// 获取当前执行器的分片信息ShardingUtil.ShardingVOshardingVO=ShardingUtil.getShardingVo();intindex=shardingVO.getIndex();// 当前执行器编号(从0开始)inttotal=shardingVO.getTotal();// 执行器总数// 查询所有需要处理的数据List<Long>userIds=getAllUserIds();// 只处理分配给自己的那部分for(inti=index;i<userIds.size();i+=total){processUser(userIds.get(i));}log.info("分片 {}/{} 处理完成,处理 {} 条",index+1,total,userIds.size()/total);returnReturnT.SUCCESS;}

五、在管理台配置任务

登录调度中心 → 执行器管理 → 新增执行器:

AppName: seckill-executor 名称: 秒杀系统执行器 注册方式: 自动注册

任务管理 → 新增任务:

执行器: seckill-executor 任务描述: 超时订单处理 调度类型: cron Cron: 0 */1 * * * ? ← 每分钟执行一次 运行模式: Bean JobHandler: timeoutOrderHandler

六、任务参数传递

@XxlJob("paramJob")publicReturnT<String>paramJob(Stringparam){// param 是在调度中心配置任务时填写的参数log.info("接收参数: {}",param);if(StringUtils.isNotBlank(param)){JSONObjectjson=JSONObject.parseObject(param);Stringdate=json.getString("date");intlimit=json.getInteger("limit");// 使用参数执行任务}returnReturnT.SUCCESS;}

在调度中心的任务配置中填入 JSON 参数:

{"date":"2026-07-03","limit":1000}

七、任务执行日志

@XxlJob("logJob")publicReturnT<String>logJob(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/爬虫 实战干货,不让你白来。

相关新闻

  • 大气层1.7.1整合包:Switch破解系统的终极完整配置指南
  • 南京会场 | 7-8月学术会议征稿通知
  • 开发板驱动环境配置(ROCK 5C为例)

最新新闻

  • 第三方平台信息不一致,企业说明材料该怎么写才稳?
  • OpenCV+YOLO实战:快速搭建机器人视觉感知系统
  • Cypress vs Playwright:端到端测试框架实战选型与迁移指南
  • Yale OpenHand:重新定义机器人抓取的开源硬件革命
  • 开题写作告别反复改稿,okbiye 一站式 AI 开题功能打通科研起步全流程
  • 从Prompt到自动化:Loop Engineering构建AI Agent自主工作流

日新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号