xxl-job源码分析(一):简介和使用

618 阅读4分钟

一.简介

1.架构设计

xxl-job是一个开源的分布式定时任务框架,其调度中心和执行器是相互分离,分开部署的,两者通过HTTP协议进行通信。其架构如下图所示:

image.png 本文使用版本是2.3.1版本

2.核心概念

调度中心:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover,支持创建执行器等功能。
执行模块(执行器):
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。

3.相关表结构

xxl-job将任务信息以及日志信息持久化到数据表中,这个就保证了可以动态的添加删除任务。

  1. xxl_job_lock:任务调度锁表,在线程查询任务信息时会调用上锁。
  2. xxl_job_group:执行器信息表,维护任务执行器信息;
  3. xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
  4. xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
  5. xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
  6. xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
  7. xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
  8. xxl_job_user:系统用户表;

4. xxl-job与quartz的异同

image.png

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 。

核心类调用关系如下如

image.png

二.使用

1.项目构成

将xxljob的源码下载后,可以看到三个项目

image.png

  • 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后,可以看到控制台

image.png

2.启动业务接入方 xxl-job-executr-sample-springboot

启动后的配置文件

image.png

3.admin控制台,进行配置

3-1. 手动创建执行器

xxl-admin的执行器,需要手动去创建,程序不会创建,可以在控制台的"执行器管器"中进行创建

image.png

3-2 创建定时任务

image.png 选择执行器,调度类型,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
}