xxl-job压缩包:
官网与源码下载地址
官网:分布式任务调度平台XXL-JOB
源码下载地址:Releases · xuxueli/xxl-job · GitHub
准备工作
1.下载源码
根据上面提供的 源码下载地址 链接进去下载源码就完事
windows 下使用下载这个就行了
下载源码之后解压到一个位置
2.IDEA导入项目
导入之后是这样的
可以看到作者提供的源码里面主要分了三个模块
- xxl-job-admin
- xxl-job-core
- xxl-job-executor-samples
我们先看看 xxl-job-admin 这个模块
在启动这个模块之前先要做数据的准备工作
3.数据准备
先将所需要的表准备好,这里直接用作者提供的 sql 就行
复制 sql ,到你自己的数据库中执行
修改配置文件
这里改成你自己数据库的配置(你可以看看其它的配置信息,里面也有修改发送邮件等配置)
4.登陆任务调度中心
运行 xxl-job-admin 的启动类
启动完成后就可以登陆上去看看,地址:http://localhost:8080/xxl-job-admin
进去是这样子的,但是需要账号跟密码
其实账号和密码就在之前运行的sql之中
但是这个密码是通过md5加密而来的,真实的密码是 123456
账号:admin
密码:123456
输入账号和密码,登陆之后就能看任务调度中心的控制页面了
你可以自己点一下这个侧边栏,看看都有什么
现在控制平台已经开启了,那我要怎么添加我的定时任务呢?
5.测试定时任务
这里作者提供了 xxl-job 整合其它框架或者软件,这里我们先学习整合 spring-boot 的来,毕竟这个对于 java 开发是最重要的
可以看到整合了 spring-boot 的这个项目中的 pom 文件里是有引入这个 xxl-job-core 的依赖的
(这个项目下的两个子项目都引入了xxl-job-core这个依赖,这里使用SpringBoot的项目)
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
所以在我们自己的项目中如果到时候要用这个定时器,也需要加入这个依赖
作者这里也提供了 docker 的配置,需要在自己服务器上运行的可以使用
再来看看这个项目的配置文件
配置文件的内容如下:
# web port
server.port=8081
# no web
#spring.main.web-environment=false
# log config
logging.config=classpath:logback.xml
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
### 这里主要是配置你任务调度中心的地址(就是控制平台的),如果你是本地起的就不需要改了,否则改成你服务器上的地址
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
### 这个就是你定时器执行的端口,我这边改成使用服务自带的端口,然后再配置类中做个偏移处理,这样端口比较好维护点
xxl.job.executor.port=${server.port}
#xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
再看看配置类
内容如下:
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(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;
}
}
修改执行器端口偏移(这个看你自己的喜好,你可以自己去指定端口,可以拿服务的端口加上1000而的来执行器端口的)
或者直接用他原来配置的9999端口
我这里用的原本的的端口
直接运行下这个 xxl-job-executor-sample-spring 服务的启动类
启动之后去 任务调度中心 的 执行器管理 就能看到自动注入的执行器了,端口是9999(+1就用10000,以此类推)
port改成port+1:
再来回过头看看 任务调度中心 的 任务管理 ,之前这里有个默认的定时任务
这个定时任务其实就是 xxl-job-executor-sample-springboot 中的任务,可以在 SampleXxlJob.java 类中找到
那就来执行下这个定时器任务呗
再看看这个测试任务1 ,它的 cron 表达式是这样的0 0 0 * * ? *
在线Cron表达式生成器:在线Cron表达式生成器 - 码工具
可以看到这个是每天凌晨 0 点执行,这可不成,那就改一改吧
在右侧 操作 - 编辑 可修改定时规则
修改这个 测试任务1 的执行规则为:每天 15:05每 10 秒执行一次(因为我当前的时间是 14:59 ) cron表达式为: 0/10 3 15 * * ?或0/10 3 15 * * ? *(指定了每年)
再去修改下这个项目的 demoJobHandler 定时任务,给它打印点东西,便于观察
重启该项目,清空控制台
启动下该定时任务
在右侧 操作 - 启动 启动该定时任务
到点了,就去控制台看看执行情况
可以看到控制台有六次打印(因为设置的就是 11:35 开始每 10 秒 执行一次)
也可以去查询这个定时任务的日志
源码学习
AppName
也就是这里配置的
整合到自己的项目中
新增模块
对于怎么使用这个 xxl-job 可以去后面学习,现在我就把它整合到自己的项目中去
在我自己的项目新增模块 pay-xxl-job(名字自己取均可)
配置依赖
然后配置依赖
<!--xxl-job-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pay</groupId>
<artifactId>pay-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>pay-xxl-job</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--xxl-job-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
<!--整合mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mybatis-plus-generator -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
<scope>compile</scope>
</dependency>
<!--pay-common-->
<dependency>
<groupId>com.pay</groupId>
<artifactId>pay-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
项目结构
项目结构中必不可少的是config和Handler
我的项目结构
代码修改
resources里的代码可以直接拷过来
参考xxl-job的分片广播代码代码,进行修改成自己的代码
/**
* 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);
}
}
}
修改成自己的代码,这个代码不是最终的,就是用来做一个测试的
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author 周益和
* @ClassName PaymentDailyReportHandler
* @qq 1552951165
*/
@Component
@Slf4j
public class PaymentDailyReportHandler {
@XxlJob("PaymentDailyReportHandler")
public void shardingJobHandler(){
// 获取到定时任务 对应在注册中心 index位置
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
log.info("shardIndex:{},shardTotal:{}",shardIndex,shardTotal);
}
}
测试
启动服务
创建APPJob的启动类,然后启动两个服务
新增执行器
回到 任务调度中心 - 执行器管理 ,刷新好像也没看到刚刚启动的服务也没有注册到这个管理当中,那就自己 新增 吧
填写name,名称,选择自动注册等待一段时间即可
自动注册刷新不出来
自动注册,注册不出来,有可能是有些地方和源码不一样
检查配置类中的地址和自己设置的appname和新增的执行器是否一致,我这里是token这里复制过来没有写这个default_token,然后就不能自动注册进来了
自动刷新不出来就选择手动(选手动就输入自己的地址,在服务的控制台可以查看,我的是两个,9999和10000)
选择手动输入两个
刷新之后就出来了
新增定时任务
填写相应的一些信息后,设置每秒,运行模式选择java--可以不用输入后面的JobHandler,路由模式为分片,点击保存
启动运行
可以在服务端查询到输出
也可以在日志里查询到结果