XXL-JOB 配置选项详解
0. 搭建XXL-JOB
访问 https://www.twenhub.com/archives/xxl-job-3.1.0-da-jian-zhi-nan
项目结构与关系架构
1. 基础配置
管理后台访问方式
http://调度中心服务器公网IP:8080/xxl-job-admin/
admin/123456
单机、集群推荐配置

1.1 执行器配置
执行器
- 含义:任务归属的执行器,用于任务分组和自动发现
- 配置:从下拉列表选择已注册的执行器
- 说明:每个任务必须绑定一个执行器,执行器会自动注册到调度中心
任务描述
- 含义:任务的描述信息
- 配置:输入简洁明了的任务描述
- 说明:便于任务管理和识别,建议包含任务的主要功能
负责人
- 含义:任务的负责人
- 配置:输入负责人姓名或工号
- 说明:用于任务管理和问题追踪
报警邮件
- 含义:任务失败时的邮件通知地址
- 配置:输入邮箱地址,多个邮箱用逗号分隔
- 说明:任务调度失败时会发送邮件通知
2. 调度配置
2.1 调度类型(重要配置)
CRON(最常用)
- 含义:使用CRON表达式进行定时调度
- 配置:选择CRON类型,在Cron字段输入表达式
- 适用场景:
- 定时任务(如每天凌晨数据同步)
- 周期性任务(如每小时统计报表)
- 复杂时间规则的任务
CRON表达式格式:秒 分 时 日 月 周 年
常用表达式示例:
# 每天凌晨2点执行
0 0 2 * * ?
# 每30分钟执行一次
0 */30 * * * ?
# 工作日9-17点每小时执行
0 0 9-17 * * MON-FRI
固定速度
- 含义:按固定时间间隔执行
- 配置:输入间隔秒数
- 适用场景:需要严格按时间间隔执行的任务
固定延迟
- 含义:上次执行完成后延迟固定时间再执行
- 配置:输入延迟秒数
- 适用场景:任务执行时间不固定,需要等待上次完成的场景
无
- 含义:不自动调度,只能手动触发
- 适用场景:临时任务或测试任务
3. 任务配置
3.1 运行模式(核心配置)
BEAN模式(推荐)
- 含义:任务代码在执行器项目中维护
- 配置:
- 选择BEAN模式
- JobHandler填写@XxlJob注解的value值
- 优点:
- 代码在项目中,便于版本管理
- 可以使用Spring依赖注入
- 支持IDE调试
- 适用场景:Java项目的业务任务
示例代码:
@XxlJob("demoJobHandler")
public ReturnT<String> demoJobHandler(String param) {
// 业务逻辑
return ReturnT.SUCCESS;
}
GLUE模式(Java)
- 含义:任务代码在调度中心Web界面维护
- 配置:选择GLUE(Java),在Web IDE中编写代码
- 优点:
- 无需重启应用即可修改任务逻辑
- 支持热部署
- 缺点:
- 代码管理不便
- 无法使用IDE调试
- 适用场景:简单的数据处理任务、临时任务
GLUE模式(脚本)
支持多种脚本类型:Shell、Python、PHP、NodeJS、PowerShell
适用场景:
- Shell:系统运维任务、文件处理
- Python:数据分析、机器学习任务
- PHP:Web相关任务
- NodeJS:前端构建、API调用
- PowerShell:Windows环境任务
3.2 其他任务配置
JobHandler
- 含义:BEAN模式下对应的处理器名称
- 配置:输入@XxlJob注解的value值
- 注意:必须与代码中的注解值完全一致
任务参数
- 含义:传递给任务的参数
- 配置:输入JSON格式或简单字符串
- 说明:可在任务代码中通过参数获取
4. 高级配置
4.1 路由策略(集群环境重要)
| 策略 | 含义 | 适用场景 |
|---|---|---|
| 第一个/最后一个 | 固定选择第一个或最后一个执行器 | 单机执行的任务 |
| 轮询(ROUND) | 依次轮流选择执行器 | 负载均衡,任务可以在任意机器执行 |
| 随机(RANDOM) | 随机选择在线的执行器 | 负载均衡,对执行顺序无要求 |
| 一致性HASH | 根据任务ID的Hash值固定选择执行器 | 需要任务固定在某台机器执行的场景 |
| 最不经常使用/最近最久未使用 | 选择使用频率最低或最久未使用的机器 | 负载均衡优化 |
| 故障转移(FAILOVER) | 按顺序检测,选择第一个心跳正常的机器 | 高可用场景,自动避开故障机器 |
| 忙碌转移(BUSYOVER) | 按顺序检测,选择第一个空闲的机器 | 避免机器过载 |
| 分片广播(SHARDING_BROADCAST) | 所有执行器都执行,系统自动传递分片参数 | 大数据处理任务、需要并行处理的任务、分布式计算 |
4.2 任务依赖配置
子任务ID
- 含义:当前任务成功后触发的子任务
- 配置:输入子任务的ID,多个用逗号分隔
- 适用场景:任务依赖链,工作流场景
4.3 调度过期策略
忽略(推荐)
- 含义:忽略过期的调度,从当前时间重新计算下次执行
- 适用场景:大部分场景
立即执行一次
- 含义:立即执行过期的任务,然后重新计算下次执行
- 适用场景:不能错过的重要任务
4.4 阻塞处理策略(重要配置)
单机串行(默认推荐)
- 含义:同一台机器上的任务串行执行
- 描述:
- A任务没执行完成且没超时,B任务到达
- B任务会等待A任务执行完成再执行
- A任务没执行完成且超时,B任务到达
- A任务超时被中断(与B任务无关)
- B任务仍然在队列中等待
- A任务被中断后,B任务立即开始执行
- A任务没执行完成且没超时,B任务到达
- 适用场景:
- 大部分业务场景
- 需要保证执行顺序的任务
- 资源竞争的任务
丢弃后续调度
- 含义:如果上次任务还在执行,丢弃本次调度
- 适用场景:
- 执行时间较长的任务
- 允许跳过某些执行的任务
覆盖之前调度
- 含义:强制中断上次任务,执行本次任务
- 适用场景:
- 实时性要求高的任务
- 新任务比旧任务更重要的场景
- 注意:可能导致数据不一致,谨慎使用
4.5 超时和重试配置
任务超时时间
- 含义:任务执行的最大时长(秒)
- 描述:超时后任务会强制中断
- 配置:输入秒数,0表示不限制
- 建议:
- 一般任务:300-1800秒
- 数据处理任务:3600-7200秒
- 长时间任务:根据实际需要设置
失败重试次数
- 含义:任务失败后的重试次数
- 配置:输入重试次数,0表示不重试
- 建议:
- 网络相关任务:3-5次
- 数据库操作:1-3次
- 文件处理:1-2次
- 外部API调用:2-3次
5. 场景化配置案例
5.1 数据同步任务
业务特点:定时从数据库A同步数据到数据库B
推荐配置:
执行器: data-sync-executor
任务描述: 用户数据同步任务
调度类型: CRON
Cron表达式: 0 0 2 * * ? # 每天凌晨2点
运行模式: BEAN
路由策略: 第一个
阻塞处理策略: 单机串行
任务超时时间: 1800秒
失败重试次数: 3次
配置理由:
- 凌晨执行避开业务高峰
- 单机串行保证数据一致性
- 重试3次应对网络抖动
5.2 实时数据处理
业务特点:每分钟处理消息队列中的数据
推荐配置:
执行器: realtime-processor
任务描述: 实时消息处理
调度类型: CRON
Cron表达式: 0 */1 * * * ? # 每分钟执行
运行模式: BEAN
路由策略: 轮询
阻塞处理策略: 丢弃后续调度
任务超时时间: 50秒
失败重试次数: 1次
配置理由:
- 高频执行保证实时性
- 轮询分散负载
- 丢弃后续调度避免积压
5.3 报表生成任务
业务特点:每周一生成上周业务报表
推荐配置:
执行器: report-generator
任务描述: 周报表生成
调度类型: CRON
Cron表达式: 0 0 9 ? * MON # 每周一上午9点
运行模式: BEAN
路由策略: 第一个
阻塞处理策略: 单机串行
任务超时时间: 3600秒
失败重试次数: 2次
报警邮件: [email protected]
配置理由:
- 周一生成上周报表符合业务需求
- 单机执行保证报表唯一性
- 较长超时时间应对复杂计算
5.4 大数据分片处理
业务特点:处理海量数据,需要分片并行
推荐配置:
执行器: bigdata-processor
任务描述: 用户行为数据分片处理
调度类型: CRON
Cron表达式: 0 0 1 * * ? # 每天凌晨1点
运行模式: BEAN
路由策略: 分片广播
阻塞处理策略: 单机串行
任务超时时间: 7200秒
失败重试次数: 1次
配置理由:
- 分片广播实现并行处理
- 凌晨执行避开业务高峰
- 较长超时时间应对大数据量
5.5 系统监控任务
业务特点:每5分钟检查系统状态
推荐配置:
执行器: monitor-executor
任务描述: 系统健康检查
调度类型: CRON
Cron表达式: 0 */5 * * * ? # 每5分钟
运行模式: BEAN
路由策略: 故障转移
阻塞处理策略: 覆盖之前调度
任务超时时间: 60秒
失败重试次数: 2次
报警邮件: [email protected]
配置理由:
- 高频监控及时发现问题
- 故障转移保证监控可用性
- 覆盖之前调度保证监控实时性
5.6 文件清理任务
业务特点:每天清理过期的临时文件
推荐配置:
执行器: file-cleaner
任务描述: 临时文件清理
调度类型: CRON
Cron表达式: 0 30 3 * * ? # 每天凌晨3:30
运行模式: GLUE(Shell)
路由策略: 分片广播
阻塞处理策略: 单机串行
任务超时时间: 1800秒
失败重试次数: 1次
配置理由:
- Shell脚本适合文件操作
- 分片广播清理多台机器
- 凌晨执行不影响业务
5.7 外部API数据拉取
业务特点:每小时从第三方API获取数据
推荐配置:
执行器: api-fetcher
任务描述: 第三方数据拉取
调度类型: CRON
Cron表达式: 0 0 * * * ? # 每小时整点
运行模式: BEAN
路由策略: 最不经常使用
阻塞处理策略: 丢弃后续调度
任务超时时间: 300秒
失败重试次数: 3次
报警邮件: [email protected]
配置理由:
- 负载均衡避免单点压力
- 重试3次应对网络问题
- 丢弃后续调度避免API限流
5.8 数据备份任务
业务特点:每天备份重要数据库
推荐配置:
执行器: backup-executor
任务描述: 数据库备份
调度类型: CRON
Cron表达式: 0 0 4 * * ? # 每天凌晨4点
运行模式: BEAN
路由策略: 第一个
阻塞处理策略: 单机串行
任务超时时间: 5400秒
失败重试次数: 1次
报警邮件: [email protected]
配置理由:
- 固定机器执行保证备份一致性
- 较长超时时间应对大数据量
- 失败必须告警,重试次数不宜过多
6. 配置最佳实践
6.1 调度时间选择原则
| 时间段 | 适用任务类型 | 说明 |
|---|---|---|
| 凌晨1-6点 | 大数据处理、备份任务 | 业务低峰期,资源充足 |
| 工作时间 | 监控任务、轻量级任务 | 避免影响用户体验 |
| 错峰执行 | 多个重任务 | 避免资源竞争 |
6.2 超时时间设置指南
| 任务类型 | 推荐超时时间 | 说明 |
|---|---|---|
| 快速任务 | 30-300秒 | API调用、简单查询 |
| 一般任务 | 300-1800秒 | 数据处理、文件操作 |
| 复杂任务 | 1800-7200秒 | 大数据分析、复杂计算 |
| 大数据任务 | 根据实际测试确定 | 分片处理、数据迁移 |
6.3 重试策略建议
| 任务类型 | 推荐重试次数 | 理由 |
|---|---|---|
| 网络相关 | 3-5次 | 网络抖动较常见 |
| 数据库操作 | 1-3次 | 避免长时间锁定资源 |
| 文件操作 | 1-2次 | 文件系统相对稳定 |
| 关键任务 | 必须配置报警邮件 | 确保问题及时发现 |
6.4 路由策略选择指南
| 业务需求 | 推荐策略 | 说明 |
|---|---|---|
| 单机任务 | 第一个/最后一个 | 固定机器执行 |
| 负载均衡 | 轮询/随机 | 分散执行压力 |
| 高可用 | 故障转移 | 自动避开故障机器 |
| 并行处理 | 分片广播 | 多机器同时执行 |
6.5 阻塞处理原则
- 默认选择:单机串行(最安全)
- 实时任务:丢弃后续调度
- 监控任务:覆盖之前调度
- 数据一致性要求高:必须单机串行
7. 开发实战
7.1 分片任务开发
@XxlJob("shardingJobHandler")
public ReturnT<String> shardingJobHandler(String param) {
// 获取分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
// 根据分片参数处理数据
// 例如:处理 id % shardTotal == shardIndex 的数据
List<Data> dataList = dataService.getDataBySharding(shardIndex, shardTotal);
for (Data data : dataList) {
// 处理业务逻辑
processData(data);
}
return ReturnT.SUCCESS;
}
7.2 任务依赖实现
方法一:使用子任务ID
- 在父任务配置中填写子任务ID
- 父任务成功后自动触发子任务
方法二:代码中手动触发
@XxlJob("parentJobHandler")
public ReturnT<String> parentJobHandler(String param) {
try {
// 执行父任务逻辑
doParentTask();
// 手动触发子任务
XxlJobHelper.handleSuccess("父任务执行成功,触发子任务");
return ReturnT.SUCCESS;
} catch (Exception e) {
XxlJobHelper.log("父任务执行失败:" + e.getMessage());
return ReturnT.FAIL;
}
}
7.3 参数传递与解析
@XxlJob("paramJobHandler")
public ReturnT<String> paramJobHandler(String param) {
try {
// 解析JSON参数
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> paramMap = mapper.readValue(param, Map.class);
String database = (String) paramMap.get("database");
String table = (String) paramMap.get("table");
int batchSize = (Integer) paramMap.get("batchSize");
// 使用参数执行业务逻辑
processData(database, table, batchSize);
return ReturnT.SUCCESS;
} catch (Exception e) {
XxlJobHelper.log("参数解析失败:" + e.getMessage());
return ReturnT.FAIL;
}
}
8. 常见问题与解决方案
8.1 任务执行失败排查步骤
- 查看调度日志:确认调度是否成功发送
- 查看执行日志:确认具体错误信息
- 检查执行器状态:确认执行器是否在线
- 验证JobHandler:确认名称是否正确
- 检查任务参数:确认格式是否正确
- 验证权限:确认执行权限是否足够
8.2 任务重复执行问题
可能原因及解决方案:
| 原因 | 解决方案 |
|---|---|
| 阻塞处理策略配置不当 | 调整为"单机串行" |
| 任务执行时间过长 | 优化任务执行逻辑,考虑分片处理 |
| 调度频率过高 | 适当降低调度频率 |
| 网络问题导致重复调度 | 检查网络连接,增加超时时间 |
8.3 GLUE模式任务调试
调试方法:
- 在Web IDE中添加详细日志输出
- 使用
XxlJobHelper.log()记录关键信息 - 先在本地环境测试脚本逻辑
- 使用"执行一次"功能进行测试
- 分段测试,逐步验证逻辑
GLUE任务示例:
// GLUE模式Java任务示例
import com.xxl.job.core.context.XxlJobHelper;
public class GlueJobHandler {
public void execute() throws Exception {
XxlJobHelper.log("开始执行GLUE任务");
String param = XxlJobHelper.getJobParam();
XxlJobHelper.log("任务参数:" + param);
// 业务逻辑
doBusinessLogic(param);
XxlJobHelper.log("GLUE任务执行完成");
}
private void doBusinessLogic(String param) {
// 具体业务实现
}
}
9. 性能优化指南
9.1 执行器层面优化
线程池配置优化:
# 执行器线程池大小(根据任务并发度调整)
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30
# 根据服务器配置调整
# CPU密集型任务:线程数 = CPU核数 + 1
# IO密集型任务:线程数 = CPU核数 * 2
资源监控要点:
- CPU使用率不超过80%
- 内存使用率不超过85%
- 磁盘IO监控
- 网络连接数监控
9.2 任务设计优化
批量处理优化:
@XxlJob("batchProcessJobHandler")
public ReturnT<String> batchProcessJobHandler(String param) {
int batchSize = 1000; // 批量大小
int offset = 0;
while (true) {
List<Data> dataList = dataService.getDataByPage(offset, batchSize);
if (dataList.isEmpty()) {
break;
}
// 批量处理
processBatch(dataList);
offset += batchSize;
// 记录进度
XxlJobHelper.log("已处理:" + offset + " 条记录");
}
return ReturnT.SUCCESS;
}
异步处理优化:
@XxlJob("asyncJobHandler")
public ReturnT<String> asyncJobHandler(String param) {
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
// 异步任务1
processTask1();
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
// 异步任务2
processTask2();
});
// 等待所有异步任务完成
CompletableFuture.allOf(future1, future2).join();
return ReturnT.SUCCESS;
}
9.3 调度优化策略
错峰调度示例:
# 数据同步任务
数据同步A: 0 0 1 * * ? # 凌晨1点
数据同步B: 0 0 2 * * ? # 凌晨2点
数据同步C: 0 0 3 * * ? # 凌晨3点
# 报表生成任务
日报生成: 0 30 1 * * ? # 凌晨1:30
周报生成: 0 30 2 ? * MON # 周一凌晨2:30
月报生成: 0 30 3 1 * ? # 每月1日凌晨3:30
10. 监控与安全
10.1 监控告警配置
关键指标监控:
- 任务执行成功率
- 任务平均执行时长
- 任务失败频率
- 执行器在线状态
告警配置建议:
# 邮件告警配置
关键业务任务: 必须配置邮件告警
数据同步任务: 失败立即告警
监控类任务: 连续失败3次告警
报表任务: 失败后1小时内告警
10.2 安全配置要点
权限控制:
- 合理分配用户权限
- 重要任务限制操作人员
- 定期审查用户权限
- 操作日志记录
参数安全:
// 避免在任务参数中传递敏感信息
// 错误示例
String param = "database=prod&password=123456";
// 正确示例
@Value("${database.password}")
private String databasePassword;
@XxlJob("secureJobHandler")
public ReturnT<String> secureJobHandler(String param) {
// 从配置文件或环境变量获取敏感信息
String password = databasePassword;
// 业务逻辑
return ReturnT.SUCCESS;
}
网络安全:
- 执行器与调度中心使用内网通信
- 配置访问令牌(AccessToken)
- 定期更新系统和依赖包
- 启用HTTPS通信
11. 总结
11.1 配置核心要点
- 运行模式选择:BEAN模式适合Java项目,GLUE模式适合脚本任务
- 调度策略配置:CRON表达式是最常用和灵活的调度方式
- 路由策略选择:根据集群规模和业务需求选择合适策略
- 阻塞处理配置:单机串行是最安全的默认选择
- 超时重试设置:根据任务特点合理设置超时时间和重试次数
11.2 最佳实践建议
配置流程:
- 从简单配置开始,逐步优化
- 充分测试后再上线生产环境
- 建立完善的监控和告警机制
- 定期回顾和优化任务配置
运维建议:
- 建立任务配置标准和规范
- 定期备份任务配置
- 监控任务执行情况和系统资源
- 建立故障处理流程
通过合理的配置和使用,XXL-JOB能够为企业提供稳定、高效的任务调度服务,大大简化分布式任务的管理和维护工作。
注意:本文档基于XXL-JOB的常见版本编写,具体配置选项可能因版本差异而有所不同,请参考官方文档获取最新信息。