一、源码启动xxl-job
1.xxl-job 源码下载地址
https://github.com/xuxueli/xxl-job/releases/tag/2.3.0
2.执行数据库脚本
表说明:
- xxl_job_group:执行器信息表,用于维护任务执行器的信息
- xxl_job_info:调度扩展信息表,主要是用于保存xxl-job的调度任务的扩展信息,比如说像任务分组、任务名、机器的地址等等
- xxl_job_lock:任务调度锁表
- xxl_job_log:日志表,主要是用在保存xxl-job任务调度历史信息,像调度结果、执行结果、调度入参等等
- xxl_job_log_report:日志报表,会存储xxl-job任务调度的日志报表,会在调度中心里的报表功能里使用到
- xxl_job_logglue:任务的GLUE日志,用于保存GLUE日志的更新历史变化,支持GLUE版本的回溯功能
- xxl_job_registry:执行器的注册表,用在维护在线的执行器与调度中心的地址信息
- xxl_job_user:系统的用户表
3.修改xxl-job-admin配置文件applicationk.properties的数据库链接
4.修改xxl-job-admin配置文件application.propertiesk中xxl-job的token值(客户端访问请求需要配置访问token)也可以不设置。
5.启动 xxl-job-admin 之后访问地址,http://localhost:8080/xxl-job-admin/toLogin ,账号admin 密码123456
二、创建springboot工程
1.引入maven配置
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
2.在application.properites 文件中添加配置属性,xxl.job.accessToken需要和上面xxl-job配置的一致。
logging.config=classpath:logback.xml
#调度中心部署地址,多个配置逗号分隔 "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
#执行器token,非空时启用 xxl-job, access token
xxl.job.accessToken=123456
# 执行器app名称,和控制台那边配置一样的名称,不然注册不上去
xxl.job.executor.appname=demo-xxl-job
# [选填]执行器注册:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。
#从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
#[选填]执行器IP :默认为空表示自动获取IP(即springboot容器的ip和端口,可以自动获取,也可以指定),多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务",
xxl.job.executor.ip=
# [选填]执行器端口号:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
#执行器日志文件存储路径,需要对该路径拥有读写权限;为空则使用默认路径
xxl.job.executor.logpath=/data/logs/xxl-job/executor
#执行器日志保存天数
xxl.job.executor.logretentiondays=30
3.创建XxlJobConfig 配置类
package com.ybe.demoxxljob.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 Logger log = 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() {
log.info(">>>>>>>>>>> xxl-job config init.");
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;
}
}
4.创建定时任务,@XxlJob特性中的value 在xxl-job-admin配置界面中用到。
package com.ybe.demoxxljob.job;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyJobHandler {
private Logger log = LoggerFactory.getLogger(MyJobHandler.class);
//demoJobHandler 需要在xxl-job-admin的新增任务中配置为JobHandler的值
@XxlJob(value = "demoJobHandler", init = "init", destroy = "destroy")
public ReturnT<String> execute() {
log.info(" execute 任务触发成功:" + LocalDateTime.now());
return ReturnT.SUCCESS;
}
private void init() {
log.info("init 方法调用成功");
}
private void destroy() {
log.info("destroy 方法调用成功");
}
}
5.在resource目录下创建日志文件 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<property name="log.path" value="/data/logs/xxl-job/app.log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
三、创建xxl-job任务
1.进入xxl-job-admin的执行器管理菜单
2.点击新增按钮,其中AppName需要和springboot工程配置文件中的xxl.job.executor.appname值一样。选择默认的自动注册。
3.进入任务管理界面,选择刚才创建的执行器(demo-xxl-job)
4.点击新增按钮,界面中JobHandler的值配置为 demoJobHandler(@XxlJob中的value);路由策略选择第一个;Cron表示定时策略。
5.手动启动上面新增的任务
6.启动刚才创建的springboot应用,检查应用是否注册成功
7.查看调度日志
四、xxl-job-admin集群
原理:xxl-job-admin的集群就是启动多个xxl-job-admin服务节点,并且所有节点都共用一个数据库。在节点调度任务的时候会通过数据库锁来控制调度器的并发执行。如果一个节点挂了,不会影响其他节点运行。客户端使用xxl-job的集群需要在配置文件中配置多个xxl-job-admin节点地址。
1.修改xxl-job-admin配置文件的服务器端口,然后启动。新增一个8081的xxl-job-admin节点。加上之前启动的8080节点构成一个集群。
server.port=8081
2.修改springboot工程代码的 application.properties 文件
#调度中心部署地址,多个配置逗号分隔 "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin,http://127.0.0.1:8081/xxl-job-admin
3.启动springboot工程,然后关闭8080节点。检查springboot中的任务是否还在执行。如果还在执行说明连接集群成功。
五、分片任务
如果任务的路由策略选择【分片广播】,那么调度器在执行一次任务调度时,将会对所有已经连接好的执行器都进行调度,同时系统自动传递分片参数,执行器可根据分片参数开发分片任务。
分片任务两个关键参数是:
// 当前分片数,从0开始,即执行器的序号
int shardIndex = XxlJobHelper.getShardIndex();
//总分片数,执行器集群总机器数量
int shardTotal = XxlJobHelper.getShardTotal();
1.在springboot工程中的MyJobHandler添加分片任务代码
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {
// 当前分片数,从0开始,即执行器的序号
int shardIndex = XxlJobHelper.getShardIndex();
//总分片数,执行器集群总机器数量
int shardTotal = XxlJobHelper.getShardTotal();
XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
// 业务逻辑
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
log.info("第 {} 片, 命中分片开始处理", i);
} else {
log.info("第 {} 片, 忽略", i);
}
}
}
2.在xxl-job-admin中添加分片任务
3.启动多个springboot实例,修改 application.properties 文件中的server.port 端口和 xxl.job.executor.port 端口然后启动。检查是否注册成功。
4.执行刚创建的分片任务
5.检查springboot每个实例是否执行任务,并且输出参数。