通过 3W1H 来认识XxlJob
Step1: 第一个W(What)先来看看它是什么?
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
Step2: 第二个W (Why)为什么要去学习XxlJob?
- 现在越来越多的企业都开始在使用 XxlJob 做为第三方平台进行任务调度。
- XxlJob 上手容易,学习成本低,功能强大。
- 涉及到 XxlJob 相关的业务需要有深入的了解才可以做好全面的测试。
Step3: 第三个W (Where)它在系统框架中的位置?
先来看看 XxlJob 自身的系统结构:
Step4: H即How 怎么样去部署和使用?
这里以单机部署为示例
(1):clone 代码:git clone https://github.com/xuxueli/xxl-job
(2):初始化数据库
/xxl-job/doc/db/tables_xxl_job.sql
数据库相关说明:
- -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:系统用户表;
(3):调度中心配置
/xxl-job/xxl-job-admin/src/main/resources/application.properties
主要是配置了数据库的连接:
代码语言:javascript复制### web
server.port=8080
server.servlet.context-path=/xxl-job-admin
### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
spring.datasource.url=jdbc:mysql://192.168.3.2:3306/xxl_job_test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=beta
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
(4):执行器项目配置
要与调度中心部署的地址一致
代码语言:javascript复制### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job executor appname
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-demo
此处的执行器名称会自动注册到调度中心平台上面去,如下所示:
(5):启动服务
先使用IDEA来启动调度中心项目,如下所示:
xxl-job-admin 的8080 端口被启动了。
再使用IDEA来启动执行器项目,如下所示:
xxl-job-Executor 的8081端口被启动了。
xxljob 运行原理
运行原理图所示:
原理解释:
1. 任务执行器根据配置的调度中心的地址,启动注册线程向调度中心的执行器管理发起自动注册。执行器管理中保存着注册执行器,后续会根据这个注册信息给执行器下发任务。
2. 如果此时有需要执行的任务,任务管理模块会根据执行器管理中注册的执行器信息,向任务执行器下发任务。任务执行器中的任务执行服务接受到任务以后会将任务发送到待执行任务的队列中,队列中的任务会由执行线程 JobHandler 依次获取并且执行。
这里会维护一个任务执行的线程池,池中就是一个个 JobHandler 线程,它们是执行任务的主力军。
3. JobHandler 执行器基于线程池执行任务,并把执行结果放入执行结果队列中,同时会把执行日志写入任务日志文件中,以供日志查询。
然后通知毁掉线程,告知任务执行完毕,回调线程会通知调度中心的监控运维模块,任务执行完毕。
4. 用户可以在调度中心查看任务日志,其过程是通过发送日志查询请求给任务执行器中的日志服务,然后查询任务日志文件实现的。
实际示例分析
示例:
- 在任务执行器端开发一个任务示例:
内容非常的简单,就是获取请求的参数,然后再日志输出。
代码语言:javascript复制@XxlJob("testJobHander")
public void testJobHander() throws Exception{
String param = XxlJobHelper.getJobParam();
XxlJobHelper.log("the param is:" param);
}
2. 在调度中心 > 任务管理【页面】>【新增】任务相关配置
如下所示:
3. 是点击【操作】下面的执行一次【输入参数为:this is test】,可以查看调度日志:
4. 可以查看【运行报表】数据:
end