xxljob学习

xxl-job压缩包:

📎xxl-job-2.4.1.zip

官网与源码下载地址

官网:分布式任务调度平台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,路由模式为分片,点击保存

启动运行

可以在服务端查询到输出

也可以在日志里查询到结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值