Xxl_Job 操作文档
(V0.1)
历史修订记录
编号 | 修订日期 | 版本号 | 修订人 | 说明 |
01 | 2023-04-11 | V0.1 | 文档新增 | |
1.配置执行器时Xxl_Job的核心依赖下载不下来... 13
2. 调度任务时io.netty.handler.timeout.IdleStateHandler类报错... 13
一、Xxl_Job认识
- Xxl_job 原理
Xxl_job总体分为两个部分:
- 调度中心:独立的一个轻量系统平台,将执行器注册到此平台上,创建实例以控制执行器中的业务执行时间和频率。 (官方解释:负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统和任务解耦,提高了系统可用性和稳定性。通调度性能不在受限于任务模块。)
- 执行器:执行器就是我们自己的项目,可以通过 IP:端口 的形式注册到调度中心,我们通过在自己的项目里面写类(用@XxlJob注解标注)供给调度中心调用。(官方解释:负责接收调度中的请求并执行任务逻辑。任务模块专注于任务的执行操作,开发和运维更加简单和高效。)
- Xxl_job项目目录解读
-- /doc :文档资料
-- /db :“调度数据库”建表脚本
调度中心是一个轻量型系统需要部署到本地或者服务器上,建表脚本里面是该系统所依赖的数据库。
-- /xxl-job-admin :调度中心,项目源码
-- /xxl-job-core :公共Jar依赖
-- /xxl-job-executor-samples :执行器,Sample示例项目
Xxl_Job自带的示例执行器,可以看作是一个小项目。
二、Xxl_job 搭建
项目源码仓库 | GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) |
xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 | |
中央仓库地址 | <!--http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${最新稳定版本}</version> </dependency> |
环境 | Maven3+,Jdk1.8+,Mysql5.7+ |
① 初始化“调度数据库”
下载项目源码并解压,获取 “调度数据库初始化SQL脚本” 并执行即可。“调度数据库初始化SQL脚本” 位置为:
/xxl-job/doc/db/tables_xxl_job.sql
② 配置“调度中心”
修改配置文件:
/xxl-job/xxl-job-admin/src/main/resources/application.properties
配置内容说明: 这里只讲两个重要的点 ①数据库连接②通讯TOKEN
### 调度中心JDBC链接:连接上一步初始化的库1
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 调度中心通讯TOKEN [选填]:非空时启用(记住这里跟执行器里面的accessToken要保持一致,否则报错)
xxl.job.accessToken= default_token
启动项目,启动类为XxlJobAdminApplication.java
启动成功后访问 http://localhost:8080/xxl-job-admin 端口为调度中心项目端口
登录账号:admin/12345
至此“调度中心”项目已经部署成功。
(可参照示例执行器项目xxl-job-executor-sample-springboot配置自己的执行器)
① Maven依赖导入
在执行器的pom文件中引入xxl_job依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
② 执行器配置文件
一般直接新增配置文件 application-xxljob.properties
配置文件内容
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;(要和调度中心配置的accessToken保持一致)
xxl.job.accessToken= default_token
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
③ 执行器配置类
参照示例项目添加XxlJobConfig.java类
xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
/**
* @author :yuhang
* @description:xxljob配置文件
* @date :Created in 2023/2023/4/12/11:04
*/
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(com.yuhang.job.config.XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@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.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
④ 执行器内写测试执行类
/**
* @author :yuhang
* @description:xxljob测试
* @date :Created in 2023/2023/4/11/11:44
*/
@Component
public class XxlJobTest {
@XxlJob("testJobHandler")
public void testJobHandler(){
System.out.println("======="+ new Date().toString() +"=== ★★★★★ ceshi1 ★★★★★ ==========");
}
}
这里的testJobHandler方法就是我们调度中心根据@XxlJob("testJobHandler")将要来调度的内容
⑤ 启动执行器项目
自己项目完成以上的配置之后启动
三、创建调度任务
① 执行器管理 à 新增
② 新增执行器,APPName和执行器配置中appname保持一致,自动注入。
③ 稍等片刻执行器就会自动注册到调度中心上
2. 新增任务管理
① 新增任务用来调度执行器内的XXl_Job
执行器:选择需要执行任务的执行器
任务描述 和 负责人:随便写
调度类型:根据实际情况选择
Cron表达式:控制执行时间和频率,示例:0/3 * * * * ?(0秒开始每三秒执行一次)
运行模式:我们一般采用BEAN模式
JobHandler:执行器中注册的任务
② 新增任务用来调度执行器内的XXl_Job
创建任务完成之后,先开始任务,再调度任务
启动成功后查看日志,我们可以看到日志每隔三秒调度一次。
在执行器内我们也可以看到Handler被调度的日志
四、常见问题
1.配置执行器时Xxl_Job的核心依赖下载不下来
解决方法:
idea打开本地调度中心项目,打开maven操作install将依赖安装到本地仓库,注意此方法需要调度中心和执行器共用同一个本地maven仓库。
2. 调度任务时io.netty.handler.timeout.IdleStateHandler类报错
解决办法:
Pom文件中添加netty-all依赖覆以盖其他版本的
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version> 4.1.48.Final</version>
</dependency>
3. Cron表达式
字段释义
* * * * * ?
秒 分 时 天(月) 月 天(周) 年份(一般省略)
符号释义
*:表示所有可能的值
示例:
每隔5分钟执行一次(从0分开始)
0 0/5 * * * ?
从0时开始,每小时执行一次
0 0 0/1 * * ?
每天的7点30分
0 30 7 * * ?
工作日的早上6点30分(即是周一到周五,每天早上的6点30分)
0 30 7 ? * MON-FRI
每个月的最后一天早上的10点整
0 0 10 L * ?
每个月的最后一个工作日的晚上6点30分(18:30)
0 30 18 LW * ?
朝九晚五,每小时
0 0 9-17 * * ?
2020年的8月份每个星期六和星期日早上10点28分28秒
28 28 10 ? 8 1,7 2020
1,7中,1表示周日,7表示周六
每个月的倒数第二天的早上8点整
0 0 8 L-1 * ?
L表示最后一天(倒数第一天),L-1则表示倒数第二天,以此类推
下面是网上一些例子,我直接拿过来了
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
要点
一般是有6个位置,分别表示 分 秒 时 天(月) 月 天(周) 第7个位置是年,一般省略
6个位置中的 天(月) 表示一个月中的第几天,即是几月几号中的几号;天(周) 表示一周中的第几天,周日为第一天,周六为第七天
天(月)和天(周)不能同时指定,其中必定有一个是 ?
? 只能用在 天(月)和天(周)
2-10:符号 - 表示范围区间
2/10:符号 / 表示频率,从2开始,每隔10,即2,12,22......类推
2,10:符号 , 表示和,2,10表示2和10
L:last的缩写,表示最后,只能用在天(月)和天(周),一般和数字搭配使用,如L在天(月)中表示一个月中的最后一天,L-1则表示每个月的倒数第二天;3L在天(周)中则表示最后一个星期二