XXL-JOB EXECUTOR 源码解析
xxl-job 是一个分布式调度框架,同时具备GLUE特性。
xxl-job 分两部分,一为执行器,二为调度器,执行器的职责是具体的作业,而调度器的职责是接收原生配置的调度策略进行任务调度执行器作业。
此文专门讲解执行器部分,全文围绕
spring boot
环境讲解。xxl-job version: 2.0.2-SNAPSHOT
官方地址:http://www.xuxueli.com/xxl-job/#/
解决了哪些问题:
- 统一管理分布式环境下的定时任务
- 界面化管理,清晰查看每一个任务的情况
- 监控任务执行情况及实时dashboard
- 集群调用、集群执行,具备HA及去除多余的分布式锁
调用顺序
- 加载配置
1 | /** |
- 利用
spring
的初始化进入到com.xxl.job.core.executor.impl.XxlJobSpringExecutor#start
方法中
1 | /** |
可以看到,start
方法很具体的分为三步:
- 加载
Jobhandler
- 根据参数刷新
GLUE
工厂 - 调用核心库加载方法
先具体看第一步:
根据spring
容器提供的ApplicationContext
扫描并读取所有注解了@JobHandler
的Bean
, 以注解@JobHandler
的值作为JobHandler
的名称,并且做了名称去重检查,然后再加入到由xxl-job
框架维护的JobHandler
仓库中,到此,JobHandler
加载完毕。
由此,也可以得出扩展,只要你能办法把你的Bean
并且带一个名称加入到这个由xxl-job
框架维护的JobHandler
仓库中,那么即使你没有经过前面的那些步骤,你这个Bean
也是一个合法的JobHandler
。而正好,这个JobHandler
仓库提供了开放的访问方式,如下:
1 | // 注入JobHandler |
再来看第二步:
第二步相对来说步骤比较简单,根据参数刷新GLUE
工厂,其实就是初始化一个工厂,目前只接受0
和1
两个参数:
0
:初始化一个普通的GLUE
工厂,依赖反射生成对象,同时使用GROOVY
类加载器编译。
1
:初始化一个Spring
的GLUE
工厂,依赖Spring
获取对象。
最后再来看第三步:
这里开始使用前面提到的那些配置,其实前面的绝大多数配置都是有默认值可以不填的,甚至连ip
、port
都是可以不提供的。真正需要填的只有两个参数xxl.job.executor.appname
、xxl.job.admin.addresses
,然而当接入了spring-cloud-common
依赖后,你这两个参数也可以不填了,这部分将在后面讲解,spring cloud
环境无缝集成xxl-job
。
1 | /** |
start
方法:
- 配置日志路径
xxl.job.executor.logpath
参数定义日志路径,默认值为:/data/applogs/xxl-job/jobhandler/gluesource
- 构建调度器客户端
根据xxl.job.admin.addresses
生成一个RPC
调用对象,而最终RPC
的调用对象的地址是拼接了一个/api
,使用Jetty
的网络包和Hessian
的序列化。
- 配置日志清理线程
日志保留天数最少保留4天,否则永久保留。
- 构建触发回调线程
调度器调用执行器执行结束后,反馈结果给调度器
- 构建执行客户端
构建外部可以访问的web入口,向调度器注册自身,提供被调度的入口。