XXL-JOB

分布式任务调度平台

📖 项目概述

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

适用场景:
  • 定时任务调度:如数据统计、报表生成、数据同步等
  • 分布式任务处理:大数据处理、批量数据导入导出
  • 业务流程自动化:定时清理、监控告警、自动化运维

🚀 核心特性

🎯 简单易用

提供Web页面对任务进行管理,管理系统支持用户管理、权限控制;支持容器化部署。

📊 动态调度

支持动态修改任务状态、启动/停止任务,以及终止运行中任务;支持配置任务执行模式。

🔧 调度中心HA

调度中心支持集群部署,保证调度中心HA;基于数据库的集群方案,保证数据一致性。

⚡ 执行器HA

任务分布式执行,任务"执行器"支持集群部署,支持动态扩展;支持故障转移。

📈 弹性扩容缩容

一次任务调度,可根据集群机器数量,自动进行任务分片;支持动态扩容执行器集群。

🔒 故障转移

任务失败时支持故障转移;支持任务超时控制;支持任务失败重试。

🏗️ 架构设计

系统架构图

调度中心 执行器集群 任务执行
MySQL数据库 任务调度 执行结果反馈

核心组件

组件 功能 说明
调度中心 统一管理任务调度平台上调度信息 负责管理调度信息,按照调度配置发出调度请求
执行器 负责接收调度请求并执行任务逻辑 任务执行模块,负责接收调度请求并执行对应的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执行器:

1. 添加依赖

<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version> </dependency>

2. 配置文件

# 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:

3. 执行器配置

@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; } }

📝 代码示例

任务开发示例

1. 基础任务

@Component public class SampleJob { @XxlJob("demoJobHandler") public void demoJobHandler() throws Exception { System.out.println("XXL-JOB, Hello World."); } }

2. 分片任务

@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); } } }

3. 生命周期任务

@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()); } }

4. 参数任务

@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作为一个轻量级的分布式任务调度平台,具有以下优势:

适用场景:中小型企业的定时任务调度需求,以及需要快速上手的分布式任务处理场景。