一.简介
1.架构设计
xxl-job是一个开源的分布式定时任务框架,其调度中心和执行器是相互分离,分开部署的,两者通过HTTP协议进行通信。其架构如下图所示:
本文使用版本是2.3.1版本
2.核心概念
调度中心:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover,支持创建执行器等功能。
执行模块(执行器):
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。
3.相关表结构
xxl-job将任务信息以及日志信息持久化到数据表中,这个就保证了可以动态的添加删除任务。
- xxl_job_lock:任务调度锁表,在线程查询任务信息时会调用上锁。
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_user:系统用户表;
4. xxl-job与quartz的异同
xxl-job的核心类如下图所示:
| 类名 | 作用 |
|---|---|
| XxlJobAdminConfig | 调度中心的总配置类,负责创建XxlJobScheduler实例 |
| XxlJobScheduler | 负责创建各种线程,包括任务注册主线程,调度容器的主线程,以及调度参数的配置线程池JobTriggerPoolHelper |
| JobScheduleHelper | 调度容器,创建一个守护线程查询所有下次执行时间在当前时间5秒内的定时任务,并按条件执行 |
| JobTriggerPoolHelper | 创建操作XxlJobTrigger的线程池,并添加trigger |
| XxlJobTrigger | 表示一个调度参数的配置,会查询具体的定时任务信息XxlJobInfo |
| XxlJob | 定义执行器的注解 |
| JobThread | 调用IJobHandler的executer执行任务,并回调调度中心 |
| IJobHandler | 抽象的执行器接口,定义了要执行的具体内容,同样的也是一个execute方法 |
| EmbedServer | 内嵌的Server,默认端口是9999 |
| ExecutorBiz | 其中的run方法用于调用执行器,有两个是实现类ExecutorBizImpl以及ExecutorBizClient 。 |
核心类调用关系如下如
二.使用
1.项目构成
将xxljob的源码下载后,可以看到三个项目
- admin 是xxljob的控制台,可以配置执行器,定时任务,dashboard查看等功能
- core 是业务方也要引入的jar包,内置通过netty于admin进行通信
- samples 项目是测试项目,包含传统spring项目如何引入xxljob和springboot如何引入
2.案例演示
2-1.启动admin
启动时注意admin下的配置文件application.properties中
// 业务方引入后,要配置相同的token,作为权限的校验
xxl.job.accessToken=default_token
启动admin后,可以看到控制台
2.启动业务接入方 xxl-job-executr-sample-springboot
启动后的配置文件
3.admin控制台,进行配置
3-1. 手动创建执行器
xxl-admin的执行器,需要手动去创建,程序不会创建,可以在控制台的"执行器管器"中进行创建
3-2 创建定时任务
选择执行器,调度类型,jobHandler,路由策略 后,就创建好了定时任务
然后点击"启动",该任务就被启动类
到了我们配置的时间间隔后,就会调用我们都代码
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
// default success
}