SpringBoot 整合 XXL-JOB 分布式定时任务实战
【摘要】 在分布式系统中,单机Quartz存在单点故障、任务分片困难、运维监控弱等问题,XXL-JOB是一款轻量级分布式任务调度平台,开箱即用、易于运维。本文从环境部署、项目接入、任务开发、分片任务、任务告警、生产避坑几个维度,完整演示SpringBoot接入XXL-JOB的实战流程,附带可直接复制的代码,适合后端开发快速落地分布式定时任务。
一、前言
很多中小型项目一开始使用Quartz或者Spring自带的@Scheduled做定时任务,简单省事,但随着服务集群部署,问题就暴露出来:
- 多实例同时执行同一个任务,造成重复执行、数据重复入库;
- 没有统一后台,任务日志、执行状态很难排查;
- 不支持分片广播,大批量数据同步效率低;
- 任务失败缺少统一告警机制。
XXL-JOB 由任务调度中心(admin)和执行器(executor)两部分组成,调度中心统一管理任务,执行器负责真正执行业务逻辑,通过注册中心通信,很好解决分布式定时任务痛点。
二、环境准备
- JDK 1.8+
- SpringBoot 2.x
- MySQL 5.7+
- XXL-JOB 2.4.0(稳定版本)
首先初始化XXL-JOB的数据库脚本,脚本在官方源码包里doc/db/tables_xxl_job.sql,导入MySQL。
然后启动xxl-job-admin调度中心,默认账号密码:admin / 123456。
三、SpringBoot项目引入依赖
<!-- xxl-job 执行器依赖 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
四、配置文件 application.yml
xxl:
job:
admin:
# 调度中心地址,多个用逗号分隔
addresses: [http://127.0.0.1:8080/xxl-job-admin](http://127.0.0.1:8080/xxl-job-admin)
executor:
# 执行器名称,后台新增任务时选择
appname: springboot-xxljob-demo
# 执行器注册地址,优先自动注册
address:
ip:
port: 9999
# 执行器日志文件存储路径
logpath: /data/xxl-job/logs
# 日志保留天数,-1=不清理
logretentiondays: 30
accessToken:
五、XXL-JOB配置类
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
private Logger log = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
六、开发任务Handler(两种模式)
方式1:Bean模式(推荐,Spring托管)
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class DemoJobHandler {
private static final Logger log = LoggerFactory.getLogger(DemoJobHandler.class);
/**
* 简单定时任务:每日数据统计
*/
@XxlJob("dailyDataStatJob")
public void dailyDataStatJob() throws Exception {
log.info("【每日数据统计任务开始】");
// 业务逻辑:统计昨日订单、流量、报表入库
// service.dailyStat();
log.info("【每日数据统计任务结束】");
}
/**
* 分片广播任务,适合大批量数据同步
*/
@XxlJob("shardDataSyncJob")
public void shardDataSyncJob() throws Exception {
// 获取分片参数
int shardIndex = com.xxl.job.core.context.XxlJobHelper.getShardIndex();
int shardTotal = com.xxl.job.core.context.XxlJobHelper.getShardTotal();
log.info("分片任务,当前分片:{}/{}", shardIndex, shardTotal);
// 根据shardIndex取模,不同实例处理不同批次数据
}
}
七、后台配置任务
- 打开
xxl-job-admin后台,新增【执行器】,AppName和配置里保持一致; - 新增任务,JobHandler填写
dailyDataStatJob; - 调度策略选择Cron表达式,例如
0 0 1 * * ?每天凌晨1点执行; - 路由策略:
- 轮询:依次分配给在线执行器
- 分片广播:全部执行器同时执行(适合分片任务)
- 随机、一致性HASH等;
- 保存后启动任务,可在后台查看执行日志、终止任务、手动触发。
八、生产环境重要避坑
- 任务幂等:分布式任务一定要做幂等,优先用业务唯一标识+数据库唯一索引,防止重复执行造成脏数据;
- 任务超时:设置合理超时时间,业务长时间阻塞会占用线程;
- 日志清理:线上一定要配置日志保留天数,避免磁盘打满;
- 调度中心高可用:admin可以集群部署,共用同一个MySQL;
- 告警配置:后台支持邮件、钉钉、企业微信告警,任务失败及时通知开发;
- 禁止长耗时任务:超大批量数据不要在一个Handler里循环,拆成分片或者异步+分页。
九、XXL-JOB 和 Quartz 对比
| 特性 | XXL-JOB | Quartz |
|---|---|---|
| 分布式 | 原生支持 | 需要自己做数据库锁 |
| 可视化后台 | 自带完善后台 | 无原生后台 |
| 分片任务 | 原生支持 | 自行实现 |
| 告警 | 内置 | 自己开发 |
| 上手难度 | 低 | 中等 |
十、总结
XXL-JOB 是国内非常流行的分布式调度框架,学习成本低、运维友好,绝大多数业务系统的定时任务场景都可以覆盖。它把调度和执行解耦,调度中心只负责发指令,执行器执行业务,天然适合微服务集群场景。
本文演示了基础接入、普通任务、分片任务,后续还可以扩展:动态创建任务、子任务、任务依赖等高级玩法。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)