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中打开
- /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
主要功能:
为了保证可用性,调度中心可以做集群部署,需要满足几个条件:
· DB配置保持一致;
· 集群机器时钟保持一致(单机集群忽视);
· 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
1.4. 创建执行器
执行器负责任务的具体执行,分配线程。执行器需要注册到调度中心,这样调度器才知道怎么选择执行器,或者说做路由。执行器的执行结果,也需要通过回调的方式通知调度器。
xxl-job提供了6个执行器的demo,非常地贴心,这里选用Spring Boot。
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. 添加任务
指挥官有了,工人也有了,下面就可以派事情给工人做了,也就是创建任务。
登录调度中心,打开任务管理界面,新增任务。
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填上就可以了。
比如:下载对账文件的任务成功以后,开始解析文件入库。入库成功以后,开始对账。
这样,多个任务就实现了串行调度。