其他
哈喽大家好啊,我是Hydra。xxl-job是一款非常优秀的任务调度中间件,轻量级、使用简单、支持分布式等优点,让它广泛应用在我们的项目中,解决了不少定时任务的调度问题。我们都知道,在使用过程中需要先到xxl-job的任务调度中心页面上,配置执行器executor和具体的任务job,这一过程如果项目中的定时任务数量不多还好说,如果任务多了的话还是挺费工夫的。假设项目中有上百个这样的定时任务,那么每个任务都需要走一遍绑定jobHander后端接口,填写cron表达式这个流程…我就想问问,填多了谁能不迷糊?于是出于功能优化(偷懒)这一动机,前几天我萌生了一个想法,有没有什么方法能够告别xxl-job的管理页面,能够让我不再需要到页面上去手动注册执行器和任务,实现让它们自动注册到调度中心呢。分析分析一下,其实我们要做的很简单,只要在项目启动时主动注册executor和各个jobHandler到调度中心就可以了,流程如下:有的小伙伴们可能要问了,我在页面上创建执行器的时候,不是有一个选项叫做自动注册吗,为什么我们这里还要自己添加新执行器?其实这里有个误区,这里的自动注册指的是会根据项目中配置的xxl.job.executor.appname,将配置的机器地址自动注册到这个执行器的地址列表中。但是如果你之前没有手动创建过执行器,那么是不会给你自动添加一个新执行器到调度中心的。既然有了想法咱们就直接开干,先到github上拉一份xxl-job的源码下来:https://github.com/xuxueli/xxl-job/https://github.com/xuxueli/xxl-job/整个项目导入idea后,先看一下结构:结合着文档和代码,先梳理一下各个模块都是干什么的:xxl-job-admin:任务调度中心,启动后就可以访问管理页面,进行执行器和任务的注册、以及任务调用等功能了xxl-job-core:公共依赖,项目中使用到xxl-job时要引入的依赖包xxl-job-executor-samples:执行示例,分别包含了springboot版本和不使用框架的版本为了弄清楚注册和查询executor和jobHandler调用的是哪些接口,我们先从页面上去抓一个请求看看:好了,这样就能定位到xxl-job-admin模块中/jobgroup/save这个接口,接下来可以很容易地找到源码位置:按照这个思路,可以找到下面这几个关键接口:/jobgroup/pageList:执行器列表的条件查询/jobgroup/save:添加执行器/jobinfo/pageList:任务列表的条件查询/jobinfo/add:添加任务但是如果直接调用这些接口,那么就会发现它会跳转到xxl-job-admin的的登录页面:其实想想也明白,出于安全性考虑,调度中心的接口也不可能允许裸调的。那么再回头看一下刚才页面上的请求就会发现,它在Headers中添加了一条名为XXL_JOB_LOGIN_IDENTITY的cookie:至于这条cookie,则是在通过用户名和密码调用调度中心的/login接口时返回的,在返回的response可以直接拿到。只要保存下来,并在之后每次请求时携带,就能够正常访问其他接口了。到这里,我们需要的5个接口就基本准备齐了,接下来准备开始正式的改造工作。改造我们改造的目的是实现一个starter,以后只要引入这个starter就能实现executor和jobHandler的自动注册,要引入的关键依赖有下面两个: