# SpringBoot集成XXL-Job企业级实战教程
XXL-Job是一款轻量级分布式任务调度框架,具有易扩展、高可用、操作便捷等特点,广泛应用于企业级项目的定时任务、分布式任务调度场景。本教程将从零开始,基于IDEA 2023 Ultimate、JDK 17、SpringBoot 3.5.10搭建企业级的SpringBoot-XXL-Job项目,完整覆盖XXL-Job的核心集成流程、企业级任务开发及最佳实践,确保你能快速落地到实际项目中。
# 1. 环境准备
# 1.1 开发环境确认
在开始前,请确保你的开发环境满足以下要求:
- IDE:IntelliJ IDEA 2023 Ultimate 版
- JDK:17(SpringBoot 3.x 最低要求JDK 17)
- SpringBoot:3.5.10
- Maven:3.9.4
- XXL-Job Admin:已部署,地址为
http://192.168.31.113:8080/xxl-job-admin/,登录账号admin,密码123456,通信端口9999
# 1.2 XXL-Job Admin前置检查
确认XXL-Job Admin服务已正常启动:
- 访问
http://192.168.31.113:8080/xxl-job-admin/,能正常显示登录页 - 使用
admin/123456登录成功,进入控制台 - 确认XXL-Job Admin的通信端口9999未被占用
# 2. 新建SpringBoot项目
# 2.1 初始化项目

# 2.2 项目结构整理
初始化后,整理项目结构为企业级标准结构:
SpringBoot-XXL-Job
├── src
│ ├── main
│ │ ├── java
│ │ │ └── cc
│ │ │ └── hep
│ │ │ ├── SpringBootXxlJobApplication.java // 启动类
│ │ │ ├── config // 配置类
│ │ │ │ └── XxlJobConfig.java // XXL-Job核心配置
│ │ │ └── job // 任务实现类
│ │ │ ├── SimpleXxlJob.java // 简单任务
│ │ │ ├── ParamXxlJob.java // 带参数任务
│ │ │ └── ShardingXxlJob.java // 分片任务
│ │ └── resources
│ │ └── application.yml // 核心配置文件
│ └── test
│ └── java
│ └── cc
│ └── hep
│ └── SpringBootXxlJobApplicationTests.java
└── pom.xml // 依赖配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 3. 引入XXL-Job核心依赖
编辑pom.xml,添加SpringBoot基础依赖和XXL-Job核心依赖(适配SpringBoot 3.x的版本为2.4.0+):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cc.hep</groupId>
<artifactId>SpringBoot-XXL-Job</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot-XXL-Job</name>
<description>SpringBoot集成XXL-Job企业级实战项目</description>
<properties>
<java.version>17</java.version>
<!-- XXL-Job版本(适配SpringBoot3.x) -->
<xxl-job.version>2.4.0</xxl-job.version>
</properties>
<dependencies>
<!-- SpringBoot核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- SpringBoot测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- XXL-Job核心依赖 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${xxl-job.version}</version>
</dependency>
<!-- 新增:SpringBoot Web依赖(让项目成为常驻Web应用) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 日志依赖(企业级日志规范) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.5.10</version>
</plugin>
</plugins>
</build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
依赖说明:
xxl-job-core:XXL-Job执行器核心依赖,2.4.0及以上版本兼容SpringBoot 3.x- 日志依赖:统一日志输出,符合企业级日志规范
# 4. XXL-Job核心配置
# 4.1 配置文件
在resources目录下编写application.yml,配置XXL-Job执行器核心参数:
# 服务器端口(避免与XXL-Job Admin的8080冲突)
server:
port: 8081
# Spring配置
spring:
application:
name: SpringBoot-XXL-Job
# XXL-Job配置
xxl:
job:
enabled: true
admin:
addresses: http://192.168.31.113:8080/xxl-job-admin/
executor:
appname: springboot-xxl-job-executor
# 这里改成你的实际IP:192.168.31.16
ip: 192.168.31.16
port: 9999
# Windows下改为相对路径
logpath: ./logs/xxl-job
logretentiondays: 30
accessToken: Hep@XXLJob2026&Admin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
配置说明:
admin.addresses:必须与XXL-Job Admin的实际地址一致executor.appname:执行器唯一标识,控制台添加执行器时需完全匹配executor.port:用户指定的通信端口9999,需确保未被占用logpath:企业级部署时建议配置绝对路径,便于日志收集和排查
# 4.2 配置类
在cc.hep.config包下编写XXL-Job核心配置类,注入执行器核心Bean:
package cc.hep.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.ip:}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken:}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
logger.info("Admin addresses: {}", adminAddresses);
logger.info("App name: {}", appname);
logger.info("IP: {}", ip.isEmpty() ? "自动获取" : ip);
logger.info("Port: {}", port);
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
配置类说明:
XxlJobSpringExecutor:XXL-Job针对Spring的执行器核心Bean,必须注入- 所有参数通过
@Value从application.yml读取,符合企业级“配置与代码分离”规范 - 添加日志输出,便于启动时排查配置问题
# 5. 企业级任务开发
基于XXL-Job的注解式开发,编写不同场景的企业级任务(覆盖简单任务、参数任务、分片任务)。
# 5.1 简单定时任务(无参数)
在cc.hep.job包下编写SimpleXxlJob,实现无参数的基础定时任务:
package cc.hep.job;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 简单定时任务(企业级规范:类名+Job,方法名清晰)
* @author hep
*/
@Component
public class SimpleXxlJob {
private static final Logger logger = LoggerFactory.getLogger(SimpleXxlJob.class);
/**
* 简单任务示例
* @XxlJob注解:value为任务唯一标识(控制台配置需一致)
*/
@XxlJob("simpleXxlJobHandler")
public void simpleXxlJobHandler() {
// 1. 任务日志(企业级规范:输出任务开始日志)
logger.info(">>>>>>>>>>> 简单定时任务开始执行 <<<<<<<<<<<");
try {
// 2. 核心业务逻辑(模拟企业级数据处理)
String jobParam = XxlJobHelper.getJobParam(); // 获取任务参数(此处为空)
logger.info("当前任务参数:{}", jobParam);
logger.info("执行企业级业务逻辑:数据同步、报表生成等");
// 3. 任务结果返回(XXL-Job控制台可见)
XxlJobHelper.handleSuccess("简单定时任务执行成功");
} catch (Exception e) {
// 4. 异常处理(企业级规范:捕获所有异常,标记任务失败)
logger.error("简单定时任务执行失败", e);
XxlJobHelper.handleFail("简单定时任务执行失败:" + e.getMessage());
} finally {
logger.info(">>>>>>>>>>> 简单定时任务执行结束 <<<<<<<<<<<");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
核心说明:
@Component:将任务类交给Spring容器管理,XXL-Job才能扫描到@XxlJob("simpleXxlJobHandler"):任务唯一标识(Handler名称),控制台配置任务时需一致XxlJobHelper:XXL-Job提供的工具类,用于获取参数、返回执行结果、日志输出等- 异常捕获:企业级任务必须捕获所有异常,避免任务中断且便于排查
# 5.2 带参数任务
编写ParamXxlJob,实现支持动态参数的任务(企业级常用场景):
package cc.hep.job;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 带参数任务(企业级场景:动态传入业务参数)
* @author hep
*/
@Component
public class ParamXxlJob {
private static final Logger logger = LoggerFactory.getLogger(ParamXxlJob.class);
/**
* 带参数任务示例
*/
@XxlJob("paramXxlJobHandler")
public void paramXxlJobHandler() {
logger.info(">>>>>>>>>>> 带参数任务开始执行 <<<<<<<<<<<");
try {
// 1. 获取控制台配置的任务参数(企业级场景:JSON格式参数)
String jobParam = XxlJobHelper.getJobParam();
logger.info("接收的任务参数:{}", jobParam);
// 2. 模拟参数解析(企业级规范:参数校验+JSON解析)
if (jobParam == null || jobParam.isEmpty()) {
throw new IllegalArgumentException("任务参数不能为空");
}
// 示例:解析JSON参数(实际项目可引入fastjson/jackson)
// JSONObject paramJson = JSONObject.parseObject(jobParam);
// 3. 核心业务逻辑
logger.info("根据参数执行业务逻辑:{}", jobParam);
XxlJobHelper.handleSuccess("带参数任务执行成功,参数:" + jobParam);
} catch (Exception e) {
logger.error("带参数任务执行失败", e);
XxlJobHelper.handleFail("带参数任务执行失败:" + e.getMessage());
} finally {
logger.info(">>>>>>>>>>> 带参数任务执行结束 <<<<<<<<<<<");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
核心说明:
- 任务参数通过
XxlJobHelper.getJobParam()获取,控制台配置任务时可动态传入 - 企业级规范:参数建议使用JSON格式,便于扩展和解析
- 参数校验:必须校验参数合法性,避免空指针或解析异常
# 5.3 分片广播任务(集群场景)
编写ShardingXxlJob,实现分片任务(企业级集群部署核心场景):
package cc.hep.job;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 分片广播任务(企业级集群场景:任务分片执行,提高效率)
* @author hep
*/
@Component
public class ShardingXxlJob {
private static final Logger logger = LoggerFactory.getLogger(ShardingXxlJob.class);
/**
* 分片任务示例
*/
@XxlJob("shardingXxlJobHandler")
public void shardingXxlJobHandler() {
logger.info(">>>>>>>>>>> 分片任务开始执行 <<<<<<<<<<<");
try {
// 1. 获取分片信息(企业级集群核心)
int shardIndex = XxlJobHelper.getShardIndex(); // 当前分片索引(0开始)
int shardTotal = XxlJobHelper.getShardTotal(); // 总分片数
logger.info("分片信息:当前分片索引={},总分片数={}", shardIndex, shardTotal);
// 2. 分片业务逻辑(模拟:不同分片处理不同数据范围)
switch (shardIndex) {
case 0:
logger.info("分片0:处理用户ID 0-10000的数据");
break;
case 1:
logger.info("分片1:处理用户ID 10001-20000的数据");
break;
case 2:
logger.info("分片2:处理用户ID 20001-30000的数据");
break;
default:
logger.info("分片{}:处理剩余数据", shardIndex);
}
XxlJobHelper.handleSuccess("分片任务执行成功,分片索引:" + shardIndex);
} catch (Exception e) {
logger.error("分片任务执行失败", e);
XxlJobHelper.handleFail("分片任务执行失败:" + e.getMessage());
} finally {
logger.info(">>>>>>>>>>> 分片任务执行结束 <<<<<<<<<<<");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
核心说明:
- 分片任务适用于集群部署,将一个大任务拆分为多个小任务,由不同执行器节点执行
XxlJobHelper.getShardIndex():获取当前执行器的分片索引(0~n-1)XxlJobHelper.getShardTotal():获取总分片数(控制台配置)- 企业级场景:分片任务常用于大数据量处理(如订单统计、数据同步),提高执行效率
# 6. XXL-Job Admin控制台配置
# 6.1 添加执行器
- 访问
http://192.168.31.113:8080/xxl-job-admin/,使用admin/123456登录 - 点击左侧菜单
执行器管理->添加执行器 - 填写执行器信息:
- 执行器名称:SpringBoot-XXL-Job-Executor(自定义)
- 执行器AppName:springboot-xxl-job-executor(必须与
application.yml中executor.appname一致) - 注册方式:自动注册(推荐,执行器启动后自动注册到Admin)
- 机器地址:留空(自动注册无需填写)
- 点击
保存
# 6.2 添加任务
以“简单定时任务”为例,添加任务配置:
- 点击左侧菜单
任务管理->添加任务 - 填写任务信息:
- 执行器:选择上一步添加的
SpringBoot-XXL-Job-Executor - 任务描述:简单定时任务(自定义)
- 调度类型:CRON
- CRON表达式:0/10 * * * * ?(每10秒执行一次,测试用)
- 任务Handler:simpleXxlJobHandler(必须与
@XxlJob注解的value一致) - 任务参数:留空(简单任务无参数)
- 路由策略:第一个(测试用,集群场景可选择分片广播)
- 执行超时时间:30秒(企业级建议配置,避免任务卡死)
- 失败重试次数:3次(企业级建议配置,提高任务成功率)
- 执行器:选择上一步添加的
- 点击
保存
# 6.3 其他任务配置
- 带参数任务:任务Handler填写
paramXxlJobHandler,任务参数填写JSON格式(如{"userId":1001,"date":"2026-01-26"}) - 分片任务:任务Handler填写
shardingXxlJobHandler,路由策略选择分片广播,总分片数配置为3(与代码中switch匹配)
# 7. 项目启动与测试
# 7.1 启动前检查
- 确认XXL-Job Admin已启动
- 确认
application.yml中executor.port=9999未被占用 - 确认日志目录
/data/xxl-job/logs/springboot-xxl-job已创建(无权限可修改为本地目录,如D:/xxl-job/logs)
# 7.2 启动项目
- 找到
SpringBootXxlJobApplication.java启动类:
package cc.hep;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 项目启动类(企业级规范:放在根包下)
* @author hep
*/
@SpringBootApplication
public class SpringBootXxlJobApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootXxlJobApplication.class, args);
System.out.println(">>>>>>>>>>> SpringBoot-XXL-Job项目启动成功 <<<<<<<<<<<");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 点击IDEA右上角
Run按钮启动项目,控制台输出以下日志表示执行器注册成功:
>>>>>>>>>>> xxl-job config init.
XXL-Job Registry Param: RegistryParam{registryGroup='EXECUTOR', registryKey='springboot-xxl-job-executor', registryValue='192.168.31.xxx:9999'}
XXL-Job Registry Success.
1
2
3
2
3
# 7.3 任务测试
- 在XXL-Job Admin控制台,找到已添加的任务,点击
执行->触发执行 - 查看任务执行日志:
- 控制台日志:IDEA控制台输出任务执行日志
- Admin日志:点击任务
日志按钮,查看XXL-Job Admin记录的执行日志
- 验证结果:
- 简单任务:每10秒执行一次,日志显示“简单定时任务执行成功”
- 带参数任务:触发时传入参数,日志显示参数解析结果
- 分片任务:集群部署多个执行器,每个执行器执行对应分片逻辑

# 8. 企业级最佳实践
# 8.1 日志规范
- 统一日志格式:包含任务ID、分片信息、执行时间、业务关键词
- 日志持久化:配置日志输出到文件,结合ELK收集日志(企业级必做)
- 敏感信息脱敏:日志中避免输出密码、手机号等敏感信息
# 8.2 任务异常处理
- 全局异常捕获:在任务类中捕获所有异常,避免任务中断
- 失败重试:合理配置重试次数(建议3次以内),避免重复执行导致数据问题
- 告警机制:XXL-Job Admin配置邮件/钉钉告警,任务失败时及时通知开发人员
# 8.3 集群部署
- 执行器集群:部署多个执行器节点,相同
appname自动注册到Admin - 分片策略:根据业务场景选择分片策略(如平均分配、轮询)
- 避免重复执行:任务逻辑中添加幂等性校验(如订单号唯一)
# 8.4 性能优化
- 任务拆分:将大任务拆分为多个小任务,避免单任务执行超时
- 异步执行:非核心逻辑采用异步处理,提高任务执行效率
- 资源隔离:重要任务单独部署执行器,避免资源抢占
# 9. 常见问题与解决方案
# 9.1 执行器注册失败
- 原因:Admin地址配置错误、端口被占用、网络不通
- 解决方案:
- 检查
admin.addresses是否与Admin实际地址一致 - 检查
executor.port是否被占用(使用netstat -ano | findstr 9999排查) - 测试执行器与Admin的网络连通性(ping 192.168.31.113)
- 检查
# 9.2 任务执行失败
- 原因:Handler名称不匹配、参数解析错误、业务逻辑异常
- 解决方案:
- 检查
@XxlJob注解的value与控制台任务Handler是否一致 - 检查任务参数格式是否正确(如JSON格式是否合法)
- 查看IDEA控制台日志,定位业务逻辑异常
- 检查
# 9.3 任务执行超时
- 原因:业务逻辑复杂、数据量过大、资源不足
- 解决方案:
- 优化业务逻辑,拆分任务
- 增加执行超时时间配置
- 升级服务器资源或采用分片执行
# 总结
- SpringBoot集成XXL-Job的核心是引入
xxl-job-core依赖、配置执行器参数、注入XxlJobSpringExecutorBean,任务开发基于@XxlJob注解实现。 - 企业级开发需关注日志规范、异常处理、集群部署和性能优化,确保任务稳定执行。
- 控制台配置的执行器AppName、任务Handler必须与代码中一致,否则会导致注册失败或任务执行失败。
通过本教程,你已掌握SpringBoot 3.5.10集成XXL-Job的全流程,可直接将这套方案落地到企业级项目中,满足定时任务、分布式任务调度的核心需求。