XXL-Job 核心功能详解
2025/8/15大约 4 分钟
XXL-Job 核心功能详解
前置知识
在学习本教程前,请确保您已经:
- 了解 XXL-Job 的基本概念
- 掌握 Java 注解的使用
- 熟悉 Spring Boot 开发
任务类型
1. Bean 模式
最常用的任务类型,通过 @XxlJob
注解开发,支持自动发现注册。
@Component
public class BeanModeJob {
@XxlJob("beanModeJobHandler")
public void execute() throws Exception {
XxlJobHelper.log("Bean模式任务执行");
// 业务逻辑
}
}
2. GLUE 模式
支持在线编辑代码,实时编译和运行,适合临时任务。
注意事项
- GLUE 模式不建议作为常规任务使用
- 代码存储在数据库中,需要注意维护成本
- 建议仅用于临时调试或紧急修复
3. HTTP 任务
通过 HTTP 接口调用执行任务,适合跨语言或轻量级任务。
# HTTP任务配置示例
url: http://www.example.com/api/task
method: POST
headers:
Content-Type: application/json
body:
param1: value1
param2: value2
调度策略
1. Cron 表达式
@XxlJob("cronJob")
public void cronJob() {
// 通过调度中心配置 Cron 表达式
// 例如:0 0/5 * * * ? 表示每5分钟执行一次
XxlJobHelper.log("Cron 调度任务执行");
}
2. 固定速度
@XxlJob("fixedRateJob")
public void fixedRateJob() {
// 通过调度中心配置固定速度
// 例如:10 表示每10秒执行一次
XxlJobHelper.log("固定速度任务执行");
}
路由策略
1. 路由策略配置
@Configuration
public class XxlJobRouteConfig {
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
// 设置路由策略
executor.setExecutorRouteStrategy("ROUND"); // 轮询策略
return executor;
}
}
2. 常用路由策略
- 第一个(FIRST):固定选择第一个机器
- 轮询(ROUND):依次轮询选择在线机器
- 随机(RANDOM):随机选择在线机器
- 一致性HASH(CONSISTENT_HASH):相同参数的任务固定调度同一台机器
任务参数
1. 参数传递
@XxlJob("paramJob")
public void paramJob() {
// 获取任务参数
String param = XxlJobHelper.getJobParam();
// 解析 JSON 参数
JSONObject jsonParam = JSON.parseObject(param);
String name = jsonParam.getString("name");
Integer age = jsonParam.getInteger("age");
XxlJobHelper.log("参数处理:name={}, age={}", name, age);
}
2. 分片参数
@XxlJob("shardingJob")
public void shardingJob() {
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
// 分片任务处理
List<Long> userIds = getUserIds(shardIndex, shardTotal);
processUsers(userIds);
}
任务控制
1. 任务状态管理
@XxlJob("controlJob")
public void controlJob() throws Exception {
try {
// 业务处理
doProcess();
// 任务成功
XxlJobHelper.handleSuccess("处理成功");
} catch (Exception e) {
// 任务失败
XxlJobHelper.handleFail("处理失败:" + e.getMessage());
throw e;
}
}
2. 任务超时控制
@XxlJob("timeoutJob")
public void timeoutJob() {
// 在调度中心配置超时时间
try {
// 模拟耗时操作
TimeUnit.MINUTES.sleep(5);
} catch (InterruptedException e) {
// 任务被中断(可能是超时导致)
XxlJobHelper.log("任务执行被中断");
}
}
日志处理
1. 日志记录
@XxlJob("logJob")
public void logJob() {
// 记录普通日志
XxlJobHelper.log("任务开始执行");
try {
// 业务处理
doProcess();
// 记录成功日志
XxlJobHelper.log("任务执行成功");
} catch (Exception e) {
// 记录错误日志
XxlJobHelper.log("任务执行失败:{}", e.getMessage());
throw e;
}
}
2. 日志查看
在调度中心提供了完整的任务执行日志查看功能:
- 执行时间
- 执行节点
- 执行参数
- 调度结果
最佳实践
任务开发建议
任务粒度
- 合理控制单个任务的执行时间
- 大任务考虑拆分或使用分片
异常处理
- 捕获所有可能的异常
- 提供清晰的错误信息
资源控制
- 注意内存使用
- 避免死锁
调度优化
路由策略
- 根据任务特性选择合适的路由策略
- 考虑机器负载均衡
执行策略
- 合理设置重试次数
- 配置合适的超时时间
常见问题
1. 如何处理任务堆积?
任务堆积的解决方案:
@XxlJob("batchJob")
public void batchJob() {
// 1. 使用分片减少单机压力
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
// 2. 批量处理提高效率
List<Task> tasks = getTasks(shardIndex, shardTotal);
processBatch(tasks);
}
2. 如何确保任务执行成功?
任务执行保障措施:
@XxlJob("reliableJob")
public void reliableJob() {
// 1. 任务执行状态跟踪
String taskId = generateTaskId();
try {
// 2. 幂等性检查
if (isProcessed(taskId)) {
return;
}
// 3. 业务处理
doProcess();
// 4. 标记处理完成
markProcessed(taskId);
} catch (Exception e) {
// 5. 异常处理和重试
handleException(taskId, e);
}
}
总结
本文详细介绍了 XXL-Job 的核心功能,包括:
- ✅ 任务类型:Bean模式、GLUE模式、HTTP任务
- ✅ 调度策略:Cron表达式、固定速度
- ✅ 路由策略:多种路由方式选择
- ✅ 任务控制:状态管理和超时控制
- ✅ 日志处理:日志记录和查看
下一步学习
- 探索 XXL-Job 的高级特性
- 学习分布式任务调度的最佳实践
- 了解任务调度的性能优化
希望这篇文章能帮助您更好地使用 XXL-Job 的核心功能!如果您有任何问题,欢迎在评论区讨论。