基础
XXL - Job采用的是调度中心(Scheduler)与执行器(Executor)分离的架构设计,这种设计带来了诸多优势,比如高可用性、可扩展性以及便于分布式部署等。
1. 调度中心(XXL - Job Admin)
这是一个独立的Web应用,负责任务的管理和调度工作。
- 主要功能:
- 提供可视化的管理界面,方便用户管理任务、执行器以及查看调度日志。
- 按照预设的调度策略触发任务。
- 监控任务的执行状态,并在任务执行异常时进行报警。
- 管理执行器的注册和发现过程。
- 技术特点:
- 基于Spring Boot开发,可独立部署。
- 需要连接数据库(支持MySQL等)来存储任务配置和调度日志。
- 部署方式:
- 至少部署一个实例,若要实现高可用,则需部署多个实例并通过Nginx进行负载均衡。
2. 执行器(Executor)
执行器是嵌入在业务系统中的组件,负责实际执行任务。
- 主要功能:
- 注册到调度中心,让调度中心知道自己的存在。
- 接收调度中心发送的任务执行请求。
- 执行具体的业务逻辑,并将执行结果返回给调度中心。
- 技术特点:
- 以Jar包的形式集成到业务系统中,目前支持Java、Python等语言。
- 支持自动注册和手动注册两种方式与调度中心建立连接。
- 部署方式:
- 可以和业务系统部署在同一服务器上,也能独立部署。
- 支持集群部署,从而实现水平扩展。
示例
下面为你提供XXL - Job调度中心与执行器分开部署启动的示例,该示例适用于生产环境或测试环境:
1. 部署调度中心(XXL - Job Admin)
步骤1:创建数据库
首先创建名为xxl - job
的数据库,然后执行官方SQL脚本:
-- 创建数据库
CREATE DATABASE xxl_job DEFAULT CHARACTER SET utf8mb4;
-- 导入SQL脚本(从GitHub获取)
-- https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql
步骤2:下载调度中心源码
从GitHub下载XXL - Job源码并解压:
git clone https://github.com/xuxueli/xxl-job.git
cd xxl-job/xxl-job-admin
注意:可以选择只保留 xxl-job-admin 模块,然后通过 Maven 引入 xxl-job-core 依赖,这样的方式能让项目结构更加简洁,同时也便于依赖管理和后续的升级维护等操作
步骤3:配置调度中心
修改application.properties
文件:
# 服务器端口
server.port=8081
# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 访问令牌(可选)
xxl.job.accessToken=
步骤4: 验证启动
运行main方法(无需打包),调度中心会在8081端口启动。
访问管理界面:http://localhost:8080/xxl-job-admin
默认账号:admin,密码:123456
2. 创建执行器项目(Spring Boot应用)
步骤1:创建Spring Boot项目
添加以下依赖到pom.xml
:
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- XXL-Job 执行器 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
步骤2:配置执行器
创建执行器配置类:
package com.example.demo.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
@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() {
XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
executor.setAdminAddresses(adminAddresses);
executor.setAppname(appname);
executor.setIp(ip);
executor.setPort(port);
executor.setAccessToken(accessToken);
executor.setLogPath(logPath);
executor.setLogRetentionDays(logRetentionDays);
return executor;
}
}
步骤3:配置application.properties
# 执行器服务端口
server.port=8081
# XXL-Job 配置
xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin # 调度中心地址
xxl.job.executor.appname=my-executor # 执行器名称(需在管理界面注册)
xxl.job.executor.ip= # 自动获取IP
xxl.job.executor.port=9999 # 执行器内部服务端口
xxl.job.accessToken= # 访问令牌(与调度中心一致)
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler # 日志路径
xxl.job.executor.logretentiondays=30 # 日志保留天数
步骤4:创建任务处理器
package com.example.demo.job;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class SampleJobHandler {
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-Job任务执行中");
// 业务逻辑...
XxlJobHelper.handleSuccess("任务执行成功");
}
}
步骤5:启动执行器
运行Spring Boot应用主类:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 在调度中心注册执行器
- 访问调度中心管理界面:http://localhost:8080/xxl-job-admin
- 进入执行器管理页面,点击"新增":
- AppName:填写
my-executor
(与执行器配置中的appname
一致) - 名称:自定义(如"示例执行器")
- 注册方式:选择"自动注册"
- 机器地址:无需填写(自动注册)
- AppName:填写
- 点击"保存"。
4. 创建并测试任务
- 进入任务管理页面,点击"新增":
- 执行器:选择刚创建的
my-executor
- 任务描述:自定义(如"示例任务")
- 调度类型:选择"固定速度"
- Cron:填写
0/5 * * * * ?
(每5秒执行一次) - 任务Handler:填写
demoJobHandler
(与任务处理器注解一致)
- 执行器:选择刚创建的
- 点击"保存",再点击"启动"。
- 查看调度日志,确认任务是否正常执行。
关键配置说明
组件 | 端口 | 用途 |
---|---|---|
调度中心 | 8081 | 管理界面和API服务 |
执行器应用 | 8080 | Spring Boot应用主端口 |
执行器内部服务 | 9999 | 接收调度中心的任务请求(无需外部访问) |
补充
1.mysql-connector-j
依赖
mysql-connector-j
是 MySQL 官方提供的 Java 数据库连接驱动(JDBC Driver),用于在 Java 应用程序中连接和操作 MySQL 数据库。它是 MySQL 8.0 版本之后的标准驱动名称,替代了旧的 mysql-connector-java
。
新旧版本对比
驱动名称 | 适用 MySQL 版本 | 主要区别 |
---|---|---|
mysql-connector-java |
5.x 及以下 | 旧版驱动,已停止更新,最后版本为 8.0.31(支持 MySQL 5 和 8)。 |
mysql-connector-j |
8.0+ | 新版驱动,从 8.0.32 版本开始独立为 mysql-connector-j ,仅支持 MySQL 8+。 |
常见问题与注意事项
版本兼容性:
- 若使用 MySQL 5.7,需切换回旧驱动:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.31</version> <!-- 最后兼容 MySQL 5 的版本 --> </dependency>
- 若使用 MySQL 8.0+,推荐使用
mysql-connector-j
。
- 若使用 MySQL 5.7,需切换回旧驱动:
JDBC URL 格式:
- MySQL 8+ 需要指定时区参数:
spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
- MySQL 8+ 需要指定时区参数:
选择依据
- 检查 MySQL 版本:
SELECT VERSION();
- 根据版本选择对应的驱动依赖。