魔改xxl-job,彻底告别手动配置任务!

原创:微信公众号 码农参上 , 欢迎分享 , 转载请保留出处 。
哈喽大家好啊,我是Hydra 。
xxl-job是一款非常优秀的任务调度中间件,轻量级、使用简单、支持分布式等优点,让它广泛应用在我们的项目中,解决了不少定时任务的调度问题 。
我们都知道,在使用过程中需要先到xxl-job的任务调度中心页面上,配置执行器executor和具体的任务job,这一过程如果项目中的定时任务数量不多还好说,如果任务多了的话还是挺费工夫的 。
魔改xxl-job,彻底告别手动配置任务!

文章插图
假设项目中有上百个这样的定时任务,那么每个任务都需要走一遍绑定jobHander后端接口,填写cron表达式这个流程…
我就想问问,填多了谁能不迷糊?
于是出于功能优化(偷懒)这一动机,前几天我萌生了一个想法,有没有什么方法能够告别xxl-job的管理页面,能够让我不再需要到页面上去手动注册执行器和任务,实现让它们自动注册到调度中心呢 。
分析分析一下,其实我们要做的很简单,只要在项目启动时主动注册executor和各个jobHandler到调度中心就可以了,流程如下:
魔改xxl-job,彻底告别手动配置任务!

文章插图
有的小伙伴们可能要问了,我在页面上创建执行器的时候,不是有一个选项叫做自动注册吗 , 为什么我们这里还要自己添加新执行器?
其实这里有个误区,这里的自动注册指的是会根据项目中配置的xxl.job.executor.appname , 将配置的机器地址自动注册到这个执行器的地址列表中 。但是如果你之前没有手动创建过执行器,那么是不会给你自动添加一个新执行器到调度中心的 。
【魔改xxl-job,彻底告别手动配置任务!】既然有了想法咱们就直接开干,先到github上拉一份xxl-job的源码下来:
https://github.com/xuxueli/xxl-job/https://github.com/xuxueli/xxl-job/
整个项目导入idea后,先看一下结构:
魔改xxl-job,彻底告别手动配置任务!

文章插图
结合着文档和代码,先梳理一下各个模块都是干什么的:
  • xxl-job-admin:任务调度中心,启动后就可以访问管理页面,进行执行器和任务的注册、以及任务调用等功能了
  • xxl-job-core:公共依赖,项目中使用到xxl-job时要引入的依赖包
  • xxl-job-executor-samples:执行示例,分别包含了springboot版本和不使用框架的版本
为了弄清楚注册和查询executorjobHandler调用的是哪些接口,我们先从页面上去抓一个请求看看:
魔改xxl-job,彻底告别手动配置任务!

文章插图
好了,这样就能定位到xxl-job-admin模块中/jobgroup/save这个接口 , 接下来可以很容易地找到源码位置:
魔改xxl-job,彻底告别手动配置任务!

文章插图
按照这个思路,可以找到下面这几个关键接口:
  • /jobgroup/pageList:执行器列表的条件查询
  • /jobgroup/save:添加执行器
  • /jobinfo/pageList:任务列表的条件查询
  • /jobinfo/add:添加任务
但是如果直接调用这些接口,那么就会发现它会跳转到xxl-job-admin的的登录页面:
魔改xxl-job,彻底告别手动配置任务!

文章插图
其实想想也明白,出于安全性考虑,调度中心的接口也不可能允许裸调的 。那么再回头看一下刚才页面上的请求就会发现,它在Headers中添加了一条名为XXL_JOB_LOGIN_IDENTITYcookie
魔改xxl-job,彻底告别手动配置任务!

文章插图
至于这条cookie , 则是在通过用户名和密码调用调度中心的/login接口时返回的,在返回的response可以直接拿到 。只要保存下来 , 并在之后每次请求时携带,就能够正常访问其他接口了 。
到这里,我们需要的5个接口就基本准备齐了,接下来准备开始正式的改造工作 。
改造我们改造的目的是实现一个starter,以后只要引入这个starter就能实现executorjobHandler的自动注册,要引入的关键依赖有下面两个:
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>

推荐阅读