分布式定时任务调度xxl-job-2. Xxl-job快速入门

时间:2024-03-12 14:58:59

1.1. 下载源码

1.1.1. release页面下载

https://github.com/xuxueli/xxl-job/releases

https://gitee.com/xuxueli0323/xxl-job

注意不要直接clone最新的master代码(SNAPSHOT版本),从发布界面下载稳定版本。

1.1.2. IDEA中打开

image.png

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

1.2. 初始化数据库

数据库脚本在doc/db目录下:
在这里插入图片描述

生成8张表。

表名 作用
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 系统用户表

表初始化好以后,就可以配置代码工程了。这里先说一下总体概念。

xxl-job的调度器和业务执行是独立的。调度器(调度线程)决定任务的调度,并且通过HTTP的方式调用执行器接口执行任务。

所以在这里需要先配置至少一个调度中心,运行起来,也可以集群部署。然后再配置至少一个执行器,运行起来,同样可以集群部署。

1.3. 配置调度中心

调度中心是任务的指挥中心,可以有多个实例。

1.1.1. 修改配置

/xxl-job/xxl-job-admin/src/main/resources/application.properties

检查各项配置,主要是端口,数据库。

默认用户名admin,密码 123456。

可以显式加上一行配置:

xxl.job.login.username=admin
xxl.job.login.password=123456

1.1.2. 编译打包

如果通过jar包方式部署运行,需要先编译打包。在xxl-job-admin目录下执行命令:

mvn package -Dmaven.test.skip=true

1.1.3. 启动工程

运行调度中心,xxl-job\xxl-job-admin\target目录下

java -jar xxl-job-admin-2.2.1-SNAPSHOT.jar

或者直接运行Spring Boot根目录下的XxlJobAdminApplication启动类。调度器是带界面的,访问:http://127.0.0.1:8080/xxl-job-admin

主要功能:

image.png

为了保证可用性,调度中心可以做集群部署,需要满足几个条件:

· DB配置保持一致;

· 集群机器时钟保持一致(单机集群忽视);

· 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。

1.4. 创建执行器

执行器负责任务的具体执行,分配线程。执行器需要注册到调度中心,这样调度器才知道怎么选择执行器,或者说做路由。执行器的执行结果,也需要通过回调的方式通知调度器。

xxl-job提供了6个执行器的demo,非常地贴心,这里选用Spring Boot。

image.png

1.1.1. 修改配置

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

主要是修改了日志目录,还有admin的端口号。

xxl.job.admin.addresses=http://127.0.0.1:7391/xxl-job-admin
xxl.job.executor.logpath=E:/dev_logs/xxl-job/jobhandler

配置类会在com.xxl.job.executor.core.config.XxlJobConfig用到。

1.1.1. 编译打包

如果通过jar包方式部署运行,需要先编译打包。

在xxl-job\xxl-job-executor-samples\xxl-job-executor-sample-springboot目录下:

mvn package -Dmaven.test.skip=true

如果这个目录无法打包,就在根目录下打包。

1.1.2. 启动工程

运行执行器,上述路径的target目录下:

java -jar xxl-job-admin-2.2.1-SNAPSHOT.jar

或者直接运行XxlJobExecutorApplication启动类。

可以做集群部署, 这两项配置要一致:

xxl.job.admin.addresses=
xxl.job.executor.appname=

1.1. 添加任务

指挥官有了,工人也有了,下面就可以派事情给工人做了,也就是创建任务。

登录调度中心,打开任务管理界面,新增任务。

image.png

1.1.1. 路由策略

路由策略指的是一个任务选择哪个执行器去执行,Quartz只能随机负载。当执行器做集群部署的时候才有意义。Xxl-job提供了丰富的路由策略,包括:

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

1.1.2. 运行模式

在xxl-job中,不仅支持运行预先编写好的任务类,还可以直接输入代码或者脚本运行(上代码都不用审核了??)。

运行任务类,这种方式就叫做BEAN模式,需要指定任务类,这个任务类就叫做JobHandler,是在执行器端编写的。

运行代码或者脚本,叫做GLUE模式,支持Java、Shell、Python、PHP、Nodejs、PowerShell,这个时候代码是直接维护在调度器这边的。

1.1.3. 阻塞处理策略

阻塞处理策略,指的是任务的一次运行还没有结束的时候,下一次调度的时间又到了,这个时候怎么处理。

策略 参数值 详细含义
单机串行,默认 SERIAL_EXECUTION 调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行
丢弃后续调度 DISCARD_LATER 调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败
覆盖之前调度 COVER_EARLY 调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务

1、SERIAL_EXECUTION(单机串行,默认):对当前线程不做任何处理,并在当前线程的队列里增加一个执行任务(一次只执行一个任务)。

2、DISCARD_LATER(丢弃后续调度):如果当前线程阻塞,后续任务不再执行,直接返回失败(阻塞就不再执行了)。

3、COVER_EARLY(覆盖之前调度):创建一个移除原因,新建一个线程去执行后续任务(杀掉当前线程)。

1.1.4. 子任务

如果需要在本任务执行结束并且执行成功的时候触发另外一个任务,那么就可以把另外的任务作为本任务的子任务运行。

因为每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),只需要把JobId填上就可以了。

比如:下载对账文件的任务成功以后,开始解析文件入库。入库成功以后,开始对账。

这样,多个任务就实现了串行调度。

1.2. 任务操作

image.png