xxl-job
在公司也是做基础架构项目的,所以免不了改造市场上一些优秀的开源组件,今天我们来看看这款定时任务调度中心xxl-job。xxl-job定时任务调度中心是业界非常流行的开源的轻量级分布式定时任务调度平台,最初是由美团点评的大神许雪里开发的,当然,现在已经有一个团队在开发了,而且社区发展的很好,版本也在不断更新,也有很多优秀的作品,有兴趣的可以去XXL项目主页看看.
基础信息
为什么要用定时任务平台来做定时任务
在springboot中,我们可以通过@Scheduled注解来实现定时任务,但是当部署模式Wie分布式,多机部署时,就会出现任务重复执行的问题,当然我们可以通过某些手段来让它只执行一次,比如redis分布式锁,这个我们后边讨论。选用一个定时任务调度中心,不但可以解决分布式的问题,而且它还可以实现动态配置,以及日志查看,等一些优秀的功能。
特性
定时任务组件也有许多,但有些显得过于重量级,比如当当开源的elastic-job,功能相对丰富,支持扩展多,但重量级的必然会有一些繁琐的东西,比如部署麻烦,阅读困难,改造成本相对较大。所以公司业务需求综合对比之下,前辈选用了xxl-job作为基础进行改造升级。
xxl-job的特性如下:
xxl-job在2.0以前的版本底层用的还是基于quartz框架实现的定时任务,而quartz本身就是apache收录的开源分布式定时任务框架,quartz实现分布式的原理基于数据库锁实现的。有兴趣的可以查看看。
使用调度平台的一个好处是可以集中查看日志与调度信息,使得定位问题更加便捷。
xxl-job架构如下:job核心模块分为job将后管平台(图中所示调度中心)和执行jar包(图中所示执行器),并将它们各自分离,需要使用到定时任务的业务系统首先添加jar包依赖项,然后做一些本地开发配置之后,到调度中心后管上进行配置定时任务相关信息即可。
后管平台包含quartz模块,也是触发任务的核心所在,具体执行任务的模块在接入jar包中,它们之间通过TCP进行通信,其实业务方接入jar包模块实则是在嵌入一个Jetty容器,让容器与业务应用同时运行。
执行过程
配置完成后,一次完整的执行示意图如下:
- 执行器(客户端),先写配置信息,在调度中心后管增加执行器AppName,客户端启动时会在客户端启动一个Jetty容器用来执行任务,执行器通过心跳机制向调度中心自动注册服务,扫描Jobhandler任务
- 后管配置任务基本信息,入库储存,保存quartz触发的配置信息
- 触发调度:
- 调度中心拉取任务基本配置信息,生成调度信息
- 加载相应的注册的执行器线程,组建任务触发信息,放入队列等待执行
- 生成日志记录线程
- 根据Jobhandler执行客户端业务逻辑任务
- 回调执行结果
- 异步记录执行日志信息,生成日志文件
结尾
至此,一次完整的任务调度就完成了,基本信息应该就是如此了,本篇文章没有深入的去代码分析,后续我们我再写文章认真分析执行流程以及我所改造后的日志文件生成体系。