1 引言
XXL-JOB
是一个优秀的分布式任务调度框架。一个好的框架底层都是枯燥无味的底层代码,经过架构师的设计、编排以及包装后,最后呈现给使用者的就是比较好用的功能模块,无需在关心底层的具体实现,直接使用即可。
但是它的底层会像我们在单体项目中那样,使用Timer
、@Scheduled
、SchedulingConfigurer
还是Quartz
?今天我们一起来探索一下。
2 源码链路追踪
xxl-job-admin
模块启动之后,就是自动执行com.xxl.job.admin.core.conf.XxlJobAdminConfig#afterPropertiesSet
方法,然后通过com.xxl.job.admin.core.thread.JobScheduleHelper#start
获取要执行的任务。
3 关键源码解析-初始化
com.xxl.job.admin.core.conf.XxlJobAdminConfig#afterPropertiesSet
项目启动初始化XxlJobScheduler
调度器
4 关键代码解析-任务调度
com.xxl.job.admin.core.thread.JobScheduleHelper#start
又在线程里面使用了带开关的死循环,来处理任务。
这里面有三个重点代码已经标出:
① 数据库锁:
采用了原生的jdbc,查询SQL直接加锁的方式防止乱序。
② 查询预执行的任务:
获取下一次执行时间和当前时间相差5s(PRE_READ_MS
)之内预执行的任务,这些任务将会被直接执行。
③ 执行任务:
直接触发业务代码,执行调度任务。
5 小结
从分析的源码来看,这直接以数据库为依托,即开启了手动提交事务,又做了同步锁。每处理完一批数据,才提交事务。提交完事务,在进行下一次的循环。
END
喜欢就点赞收藏,也可以关注我的微信公众号:编程朝花夕拾