专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  5.6K ... ·  15 小时前  
ImportNew  ·  亚马逊程序员破防:AI ... ·  2 天前  
芋道源码  ·  面试官:为什么数据库连接很消耗资源? ·  2 天前  
芋道源码  ·  我用这11招,让接口性能提升了100倍 ·  2 天前  
51好读  ›  专栏  ›  芋道源码

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

芋道源码  · 公众号  · Java  · 2025-05-01 20:21

正文

请到「今天看啥」查看全文


整个项目导入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个接口就基本准备齐了,接下来准备开始正式的改造工作。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

改造

我们改造的目的是实现一个 starter ,以后只要引入这个 starter 就能实现 executor jobHandler 的自动注册,要引入的关键依赖有下面两个:

<dependency>
    <groupId>com.xuxueligroupId>
    <artifactId>xxl-job-coreartifactId>
    <version>2.3.0version>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-autoconfigureartifactId>
dependency>

1、接口调用

在调用调度中心的接口前,先把 xxl-job-admin 模块中的 XxlJobInfo XxlJobGroup 这两个类拿到我们的starter项目中,用于接收接口调用的结果。

登录接口

创建一个 JobLoginService ,在调用业务接口前,需要通过登录接口获取 cookie ,并在获取到 cookie 后,缓存到本地的 Map 中。

private final Map loginCookie=new HashMap<>();

public void login() {
    String url=adminAddresses+"/login";
    HttpResponse response = HttpRequest.post(url)
            .form("userName",username)
            .form("password",password)
            .execute();
    List cookies = response.getCookies();
    Optional cookieOpt = cookies.stream()
            .filter(cookie -> cookie.getName().equals("XXL_JOB_LOGIN_IDENTITY"






请到「今天看啥」查看全文