1、介绍

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
XXL-JOB主要有调度中心、执行器、任务:
image.png
调度中心:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码;
主要职责为执行器管理、任务管理、监控运维、日志管理等
任务执行器:
负责接收调度请求并执行任务逻辑;
只要职责是注册服务、任务执行服务(接收到任务后会放入线程池中的任务队列)、执行结果上报、日志服务等
任务:负责执行具体的业务处理。

调度中心与执行器之间的工作流程如下:
image.png
执行流程:

  1. 注册:任务执行器根据配置的调度中心的地址,自动注册到调度中心
  2. 任务下发:达到任务触发条件,调度中心下发任务
  3. 记录结果,写入日志:执行器基于线程池执行任务,并把执行结果放入内存队列中、把执行日志写入日志文件中
  4. 信息上报:执行器消费内存队列中的执行结果,主动上报给调度中心
  5. 统一日志读取:当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情

2、搭建

2.1、根据数据库信息配置数据库

image.png

2.2、执行器

添加依 赖

  1. <dependency>
  2. <groupId>com.xuxueli</groupId>
  3. <artifactId>xxl-job-core</artifactId>
  4. </dependency>

配置yaml

  1. xxl:
  2. job:
  3. admin:
  4. addresses: http://localhost:8080/xxl-job-admin
  5. executor:
  6. appname: media-process-service
  7. address:
  8. ip:
  9. port: 9999
  10. logpath: /data/applogs/xxl-job/jobhandler
  11. logretentiondays: 30
  12. accessToken: default_token

appname这是执行器的应用名,稍后在调度中心配置执行器时要使用。

2.3、配置xxl-job执行器

XxlJobConfig.java
将示例工程下配置类拷贝到媒资管理的service工程下
image.png
拷贝至:
image.png
在调度中心添加执行器
image.png

appname是前边在nacos中配置xxl信息时指定的执行器的应用名。

image.png
添加成功
image.png
到此完成媒资管理模块service工程配置xxl-job执行器,在xxl-job调度中心添加执行器,下边准备测试执行器与调度中心是否正常通信,因为接口工程依赖了service工程,所以启动媒资管理模块的接口工程。
启动后观察日志,出现下边的日志表示执行器在调度中心注册成功
image.png
在线机器地址处已显示1个执行器。

2.3、执行

下边编写任务,任务类的编写方法参考示例工程,如下图:image.png
service包下新建jobhandler存放任务类,下边参考示例工程编写一个任务类

  1. package com.xuecheng.media.service.jobhandler;
  2. import com.xxl.job.core.context.XxlJobHelper;
  3. import com.xxl.job.core.handler.annotation.XxlJob;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.stereotype.Component;
  6. import java.util.concurrent.TimeUnit;
  7. /**
  8. ● @description 测试执行器
  9. ● @author Mr.M
  10. ● @date 2022/9/13 20:32
  11. ● @version 1.0
  12. */
  13. @Component
  14. @Slf4j
  15. public class SampleJob {
  16. /**
  17. ● 1、简单任务示例(Bean模式)
  18. */
  19. @XxlJob("testJob")
  20. public void testJob() throws Exception {
  21. log.info("开始执行.....");
  22. }
  23. }


下边在调度中心添加任务,进入任务管理
image.png
点击新增,填写任务信息
image.png
调度类型选择Cron,并配置Cron表达式设置定时策略。
Cron表达式是一个字符串,通过它可以定义调度策略,格式如下:
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
xxl-job提供图形界面去配置
image.png

3、分片广播

掌握了xxl-job的基本使用,下边思考如何进行分布式任务处理呢?如下图,我们会启动多个执行器组成一个集群,去执行任务。
image.png

集群调度策略

单个任务多个集群,选取一台机器执行任务的策略

  • FIRST(第一个):固定选择第一个机器;
  • LAST(最后一个):固定选择最后一个机器;
  • ROUND(轮询):;
  • RANDOM(随机):随机选择在线的机器;
  • CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
  • LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
  • LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
  • FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
  • BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
  • SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;

    作业分片策略

    调度中心将集群中的执行器标上序号:0,1,2,3…,广播是指每次调度会向集群中所有执行器发送调度请求,请求中携带分片参数。将单个任务按照一定策略进行分片,分开执行一个任务

image.png
每个执行器收到调度请求根据分片参数自行决定是否执行任务。
另外xxl-job还支持动态分片,当执行器数量有变更时,调度中心会动态修改分片的数量。
作业分片适用哪些场景呢?

  • 分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;
  • 广播任务场景:广播执行器同时运行shell脚本、广播集群节点进行缓存更新等。

所以,广播分片方式不仅可以充分发挥每个执行器的能力,并且根据分片参数可以控制任务是否执行,最终灵活控制了执行器集群分布式处理任务。

使用说明:
“分片广播” 和普通任务开发流程一致,不同之处在于可以获取分片参数进行分片业务处理。
ShardingJobHandler“:

  1. 代码 ```java @XxlJob(“shardingJobHandler”) public void shardingJobHandler() throws Exception { // 分片序号,从0开始 int shardIndex = XxlJobHelper.getShardIndex(); // 分片总数 int shardTotal = XxlJobHelper.getShardTotal();

```

  1. 在调度中心添加任务

image.png