分布式任务调度平台
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
提供Web页面对任务进行管理,管理系统支持用户管理、权限控制;支持容器化部署。
支持动态修改任务状态、启动/停止任务,以及终止运行中任务;支持配置任务执行模式。
调度中心支持集群部署,保证调度中心HA;基于数据库的集群方案,保证数据一致性。
任务分布式执行,任务"执行器"支持集群部署,支持动态扩展;支持故障转移。
一次任务调度,可根据集群机器数量,自动进行任务分片;支持动态扩容执行器集群。
任务失败时支持故障转移;支持任务超时控制;支持任务失败重试。
组件 | 功能 | 说明 |
---|---|---|
调度中心 | 统一管理任务调度平台上调度信息 | 负责管理调度信息,按照调度配置发出调度请求 |
执行器 | 负责接收调度请求并执行任务逻辑 | 任务执行模块,负责接收调度请求并执行对应的JobHandler中业务逻辑 |
任务 | 负责执行具体的业务处理逻辑 | 开发者开发的业务逻辑,通过JobHandler包装成任务 |
git clone https://github.com/xuxueli/xxl-job.git
创建MySQL数据库,导入初始化脚本:
-- 创建数据库
CREATE DATABASE xxl_job DEFAULT CHARACTER SET utf8mb4;
-- 导入初始化脚本
-- 执行 /xxl-job/doc/db/tables_xxl_job.sql
修改配置文件 application.properties:
# 数据库配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=password
# 调度中心配置
xxl.job.admin.triggerPoolFastMax=200
xxl.job.admin.triggerPoolSlowMax=100
# 编译打包
mvn clean package -Dmaven.test.skip=true
# 启动
java -jar xxl-job-admin-2.3.0.jar
启动成功后访问:http://localhost:8080/xxl-job-admin
默认账号:admin / 123456
在Spring Boot项目中集成XXL-JOB执行器:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
# application.yml
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
appname: xxl-job-executor-sample
address:
ip:
port: 9999
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: 30
accessToken:
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.port}")
private int port;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
return xxlJobSpringExecutor;
}
}
@Component
public class SampleJob {
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
System.out.println("XXL-JOB, Hello World.");
}
}
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
// 业务逻辑
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
XxlJobHelper.log("第 {} 片, 命中分片开始处理", i);
} else {
XxlJobHelper.log("第 {} 片, 忽略", i);
}
}
}
@XxlJob("lifecycleJobHandler")
public void lifecycleJobHandler() throws Exception {
XxlJobHelper.log("任务开始执行");
try {
// 模拟业务处理
TimeUnit.SECONDS.sleep(10);
XxlJobHelper.log("任务执行成功");
XxlJobHelper.handleSuccess("任务执行成功");
} catch (Exception e) {
XxlJobHelper.log("任务执行失败: {}", e.getMessage());
XxlJobHelper.handleFail("任务执行失败: " + e.getMessage());
}
}
@XxlJob("paramJobHandler")
public void paramJobHandler() throws Exception {
String param = XxlJobHelper.getJobParam();
XxlJobHelper.log("接收到参数: {}", param);
if (param != null && param.trim().length() > 0) {
// 处理参数
String[] params = param.split(",");
for (String p : params) {
XxlJobHelper.log("处理参数: {}", p);
// 具体业务逻辑
}
}
}
使用XxlJobHelper.log()记录关键信息,便于监控和问题定位。
确保任务具有幂等性,避免重复执行造成数据不一致。
合理设置任务超时时间,避免长时间运行影响系统性能。
完善的异常处理机制,确保任务失败时能够正确处理和告警。
XXL-JOB作为一个轻量级的分布式任务调度平台,具有以下优势: