XXL-Job快速入门+详细教程

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

XXL-Job快速入门+详细教程

1 概念

XXL-JOB是一个轻量级分布式任务调度平台
详细说明XXL-JOB是一个任务调度框架通过引入XXL-JOB相关的依赖按照相关格式撰写代码后可在其可视化界面进行任务的启动执行中止以及包含了日志记录与查询和任务状态监控
如果将XXL-JOB形容为一个人的话每一个引入xxl-job的微服务就相当于一个独立的人(执行器)而按照相关约定格式撰写的Handler为餐桌上的食物可视化界面则可以决定哪个执行器(人)吃东西或者不吃某个东西(定时任务)在什么时间吃(Corn表达式控制或者执行或终止或者立即开始)

每一个xxl-job微服务 = 独立的人执行器
每一个Handler = 餐桌上的食物
"可视化界面可以决定哪个人执行器吃或者不吃某个食物定时任务"

Quartz的不足Quartz作为开源任务调度中的佼佼者是任务调度的首选。但是在集群环境中Quartz采用API的方式对任务进行管理这样存在以下问题

  • 通过调用API的方式操作任务不人性化。
  • 需要持久化业务的QuartzJobBean到底层数据表中系统侵入性相当严重。
  • 调度逻辑和QuartzJobBean耦合在同一个项目中这将导致一个问题在调度
  • 任务数量逐渐增多同时调度任务逻辑逐渐加重的情况下此时调度系统的性能将大大受限于业务。

XXL-Job架构图
在这里插入图片描述

2 快速入门

首先从GitHub上面将项目clone下来如果网络问题导致速度慢也可以从Gitee上面拉取

GitHub地址https://github.com/xuxueli/xxl-job

Gitee地址https://gitee.com/xuxueli0323/xxl-job

2.1 启动xxl-job-admin

  1. 新建idea项目
    在这里插入图片描述
    填写项目url然后点击clone
    在这里插入图片描述
    项目结构
    在这里插入图片描述

doc文档资料包括"调度数据库"建表脚本
xxl-job-core公共 Jar 依赖
xxl-job-admin调度中心项目源码spring boot 项目可以直接启动
xxl-job-executor-samples执行器sample 示例项目其中的 spring boot 工程可以直接启动。可以在该项目上进行开发也可以将现有项目改造生成执行器项目。

  1. 配置好数据源执行sql
    在这里插入图片描述
    执行结果:
    在这里插入图片描述
  2. 打开xxl-job-admin模块在application.properties中进行后台的配置

数据库的url需要设置时区

jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai

在这里插入图片描述

在这里插入图片描述
4. 启动XxlJobAdminApplication类访问http://localhost:8080/xxl-job-admin 默认账户admn密码123456

主页面
在这里插入图片描述

2.2 创建一个新的定时任务

定位到jobhandler下新增定时任务

在这里插入图片描述

package com.xxl.job.executor.service.jobhandler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;

/**
 * @author Yi
 * @description 编写自己的定时任务handler
 * @date 2023/2/6 14:51
 */

@Component
public class MyJobHandler {

    /**
     * 简单任务示例【bean模式】
     * @param param
     * @return
     */
    @XxlJob(value = "myJobHandler", init = "", destroy = "")
    public ReturnT<String> demoJobHandler(String param) throws InterruptedException {
        //模拟业务执行
        System.out.println("we should fight..,");
        //返回执行结果
        return SUCCESS;
    }
}

2.3 在调度中心新增定时任务

  1. 选中右侧任务管理 - 新增
    在这里插入图片描述
  2. 启动XxlJobExecutorApplication执行器
    在这里插入图片描述
  3. 在调度中心启动定时任务
    在这里插入图片描述
  4. 查看结果
    在这里插入图片描述

3 详细介绍

自己的项目想要引用xxl-job导入以下依赖即可

 <dependency>
     <groupId>com.xuxueli</groupId>
     <artifactId>xxl-job-core</artifactId>
     <version>2.0.1</version>
 </dependency>

3.1 新建执行器

执行器相当于是小组组长负责任务的具体执行由它分配线程组员执行任务。执行器需要注册到调度中心这样调度中心才知道怎样选择执行器或者说做路由。执行器的执行结果也需要通过回调的方式告诉调度中心。

这里选择 spring boot 项目用来举例子从源码中单独拷一个项目出来如果你是在业务项目里集成的话也是参考这个 sample在项目里加上 xxl-job-core 的依赖添加配置就可以创建执行器了。

  1. 在xxl-job-executor-samples下新建自己的执行器模块例如xxl-job-executor-zi【直接复制xxl-job-executor-sample-springboot】修改下文件名和模块名
    在这里插入图片描述

同时修改执行器的名字否则后面会报命名冲突修改@XxlJob的value即可

  1. 修改sample-zi模块的配置将其修改为集群模式

在E盘下创建xxl-log文件夹

### xxl-job executor log-path 日志存放路径
xxl.job.executor.logpath=E:\\xxl-log

### 因为我们要模拟执行器集群部署打包后单击运行多次为服务设置随机端口
server.port=${random.int[10000,19999]}

### 执行器的端口
xxl.job.executor.port=${random.int[9000,10000]}
### 集群部署这两项配置要一致
xxl.job.executor.appname=xxl-job-executor-zi
xxl.job.executor.address=

可以直接将我的直接复制到配置文件中然后看哪块重复了直接删除即可

最终效果

# 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=default_token

### xxl-job executor appname
### xxl-job executor server-info
xxl.job.executor.ip=
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30




### xxl-job executor log-path 日志存放路径
xxl.job.executor.logpath=E:\\xxl-log

### 因为我们要模拟执行器集群部署打包后单击运行多次为服务设置随机端口
server.port=${random.int[10000,19999]}

### 执行器的端口
xxl.job.executor.port=${random.int[9000,10000]}
### 集群部署这两项配置要一致
xxl.job.executor.appname=xxl-job-executor-zi
xxl.job.executor.address=

  1. 修改idea配置

启动项目在本地启动多个执行器集群的时候这里要打上勾或者直接alt+U因为我们配置了随机端口所以是不会报错的。

在这里插入图片描述
4. 启动执行器

启动两个XxlJobExecutorApplication

在这里插入图片描述

在这里插入图片描述
5. 新增执行器
在这里插入图片描述
6. 刷新查看效果
在这里插入图片描述
注册成功

3.2 创建任务

注意点:
新建任务有几个注意点

  1. 在Spring Bean 实例中@Component 注解开发 Job 方法。方法格式要求为"public ReturnT < String > demoJobHandler(String param)"返回值和参数格式是固定的这个是不能动的唯一能动的是方法名。
  2. 在方法名上打上 @XxlJob 注解这里面有几个属性第一个 value 值对应的是调度中心新建任务的JobHandler属性的值。另外的 init 对应 JobHandler 初始化方法destory 对应 JobHandler 销毁方法。这两个方法要在任务类里面创建。
  3. 执行日志需要通过"XxlJobLogger.log"打印执行日志会写到指定的日志文件中。

3.3 其他概念

3.3.1 路由策略

路由策略是指一个任务可以由多个执行器完成那具体由哪一个完成呢这就要看我们指定的路由策略了这个参数当执行器做集群部署的时候才有意义

Quartz中只能随机负载。
那么这里的第一个最后一个是按什么顺序来的呢就是点击查看-注册节点中的1234第一个指的就是1最后一个指的就是4。
在这里插入图片描述

3.3.2 任务运行模式(BEAN、GLUE)

运行模式分为两种一种是BEAN一种是GLUE

  • BEAN模式这个是在项目中写 Java 类然后在 JobHandler 里填上 @XxlJob 里面的名字是在执行器端编写的
  • GLUE模式支持Java、Shell、Python、PHP、Nodejs、PowerShell这个时候代码是直接维护在调度中心这边的
  1. 新增一个任务模式选择为GLUE
    在这里插入图片描述
  2. 编写任务
    在这里插入图片描述
    在这里插入图片描述

但是这样会存在一个安全隐患的问题没有做鉴权。解决方法也很简单只需要在调度中心和执行器的application.properties 里加上相同的 token 即可。

xxl.job.accessToken=

3.3.3 阻塞处理策略

阻塞处理策略指的是任务的一次运行还没有结束下一次调度的时间又到了比如一个任务执行的时间是三分钟但是设置的频率是每两分钟执行一次这时候第一次还没执行完第二次怎么办

在这里插入图片描述

3.3.4 子任务

当我们要写一个 Job 的时候任务是相互依赖的。比如下面我要干这么多事情A干完了干BB干完了干CC干完了干D。
在这里插入图片描述

解决这种问题的时候思路有两种。

  • 第一种是把这么多逻辑写成一个大 job串行化。
  • 第二种就是用子任务在一个任务末尾触发另一个任务。

如果我们需要在本任务执行结束并且执行成功的时候触发另外一个任务那么就可以把另外的任务作为本任务的子任务执行因为每个 Job 都有自己的唯一 id所以只需在子任务一栏填上任务 id 即可。

3.3.5 任务超时时间

超时的意思就是如果在指定时间内没有返回结果就不再等待结果。

3.4 高级任务用法

3.4.1 分片任务

  • 假设我们有个任务需要处理20万条数据每条数据的业务逻辑处理要0.1秒对于普通任务单线程来讲需要处理5.5个小时才能处理完。这时候你想要提高速度你的第一反应就是开多线程跑嘛我开3个差不多就是一个多小时就能搞定了你的思路完全正确
    这时候将会是下面这种情况在执行器0上有三个线程在拼命的工作但是这样大家觉得好不好不好吧我执行器0在这累的要死你执行器1和执行器2在那休息旱的旱死涝的涝死首先这是一个分配不均匀的问题。其次当执行器0三个线程都在工作的时候会浪费它的资源使之这台服务器的性能也会下降所以这是一种不好的方式。

在这里插入图片描述
这时候就要用到我们的分片任务了真正好的方案如下这是一个既科学又合理的方案。三台执行器各自起一个线程来共同把这个任务完成
在这里插入图片描述
这时候有个问题三台机器大家都执行同一段代码那岂不是乱套了这个数据你也执行一遍我也执行一遍它也执行一遍。 解决的思路很简单一台执行器处理总数的1/3大家把需要干的活平均分了嘛我干1/3你干1/3它干1/3这样也不会产生冲突。
分片任务在运行的时候调度器会给每个执行器发送一个不同的分片序号分片的最大序号跟执行器的总数量是一样的确保每个执行器都会执行到这个任务比如上图中第一个执行器拿到分片序号0第二台执行器拿到分片序号1第三台执行器拿到分片序号2。那现在就好办了我们只需要把处理的数据进行模3取余余数为0的数据就由执行器0干余数为1的数据就由执行器1干余数为2的数据就由执行器2干。

我们获取数据的sql可以这样写

//count分片总数index当前分片数
select id,name,password from student where status=0 and mod(id,#{count})=#{index} order by id desc limit 1000;

在这里插入图片描述
新建任务的时候选择分片广播填上对应的JobHandler即可
在这里插入图片描述

最后需要说明一下分片的数据量不一定是完全均等的数据量上面的取模只是一个举例一个思路。我们也可以把0、1、2替换成其他条件去从所有数据中获取部分数据比如分片序号0的机器我查2018年的数据分片序号1的机器我查2019年的数据分片序号2的机器我查2020年的数据。具体怎么分全靠我们的业务来选择。

如果增加或者减少了节点总分片数和最大分片序号会实时发生变化。

3.4.2 命令任务

命令任务比较有用比如我们需要定时重启数据库service restart定时备份数据文件cp tar rm定时清理日志rm。

命令行的使用也很简单只需要把执行的命令作为参数传递进来即可

在这里插入图片描述

在这里插入图片描述

启动一下任务每过5秒这个计算器就自动弹出来了
在这里插入图片描述

3.4.3 周期性任务

周期性任务就是在任务的开始和销毁的时候执行自定义的方法做一些自己想做的事

在这里插入图片描述

注意集群情况下我们执行任务的时候需要填写执行器地址指定哪一个人吃食物

在这里插入图片描述

执行器地址在执行器管理中查看

在这里插入图片描述
效果
在这里插入图片描述

4 总结

  • 调度中心
  • 负责管理调度信息按照调度配置发出调度请求自身不承担业务代码。调度系统与任务解耦提高了系统可用性和稳定性同时调度系统性能不再受限于任务模块
  • 调度中心支持可视化、简单且动态的管理调度信息包括任务新建更新删除GLUE开发和任务报警等所有上述操作都会实时生效同时支持监控调度结果以及执行日志支持执行器Failover。
  • 调度中心会把调度请求放进一个异步调度队列理论上默认配置下的调度中心单机能够支撑5000任务并发并且稳定运行但是由于受网络延迟、DB读写耗时不同、任务调度密集程度不同会导致任务量上限会上下波动。如果需要支撑更多的任务量可以通过调大调度线程数、降低调度中心与执行器ping延迟、提升机器配置等。
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
  • 执行器
  • 负责接收调度请求并执行任务逻辑任务模块专注于任务的执行等操作开发和维护更加简单和高效
  • 接收调度中心的执行请求、终止请求和日志请求等。

参考文章:
https://blog.csdn.net/f2315895270/article/details/104714692
https://juejin.cn/post/6948397386926391333
https://juejin.cn/post/6923508824758288398
https://juejin.cn/post/6924522111465848839
https://blog.csdn.net/JesseCary/article/details/90267907

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6