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

单机、集群推荐配置
xxljob_admin_page-fovfsd.jpg

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 阻塞处理策略(重要配置)

单机串行(默认推荐)

  • 含义:同一台机器上的任务串行执行
  • 描述
    1. A任务没执行完成且没超时,B任务到达
      • B任务会等待A任务执行完成再执行
    2. A任务没执行完成且超时,B任务到达
      • A任务超时被中断(与B任务无关)
      • 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 任务执行失败排查步骤

  1. 查看调度日志:确认调度是否成功发送
  2. 查看执行日志:确认具体错误信息
  3. 检查执行器状态:确认执行器是否在线
  4. 验证JobHandler:确认名称是否正确
  5. 检查任务参数:确认格式是否正确
  6. 验证权限:确认执行权限是否足够

8.2 任务重复执行问题

可能原因及解决方案

原因解决方案
阻塞处理策略配置不当调整为"单机串行"
任务执行时间过长优化任务执行逻辑,考虑分片处理
调度频率过高适当降低调度频率
网络问题导致重复调度检查网络连接,增加超时时间

8.3 GLUE模式任务调试

调试方法

  1. 在Web IDE中添加详细日志输出
  2. 使用XxlJobHelper.log()记录关键信息
  3. 先在本地环境测试脚本逻辑
  4. 使用"执行一次"功能进行测试
  5. 分段测试,逐步验证逻辑

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 配置核心要点

  1. 运行模式选择:BEAN模式适合Java项目,GLUE模式适合脚本任务
  2. 调度策略配置:CRON表达式是最常用和灵活的调度方式
  3. 路由策略选择:根据集群规模和业务需求选择合适策略
  4. 阻塞处理配置:单机串行是最安全的默认选择
  5. 超时重试设置:根据任务特点合理设置超时时间和重试次数

11.2 最佳实践建议

配置流程

  1. 从简单配置开始,逐步优化
  2. 充分测试后再上线生产环境
  3. 建立完善的监控和告警机制
  4. 定期回顾和优化任务配置

运维建议

  • 建立任务配置标准和规范
  • 定期备份任务配置
  • 监控任务执行情况和系统资源
  • 建立故障处理流程

通过合理的配置和使用,XXL-JOB能够为企业提供稳定、高效的任务调度服务,大大简化分布式任务的管理和维护工作。


注意:本文档基于XXL-JOB的常见版本编写,具体配置选项可能因版本差异而有所不同,请参考官方文档获取最新信息。