动态添加xxljob任务-xxljob源码改造

news2025/2/5 14:49:47

在实际开发中,很多时候需要在代码中动态添加和执行xxljob的任务,那么原来的xxljob任务调度平台不能完成这项需求,就需要对源码进行改造。

1. 分析源码

1.1 请求路径

在任务调度平台新建一个任务,保存,查看发送的请求,请求路径为/jobinfo/add
在这里插入图片描述在idea的xxl-job-admin工程中,ctrl+shift+a搜索/jobinfo/add。
在这里插入图片描述

发现在JobInfoController中,有关于对任务的操作。
在这里插入图片描述

1.2 权限校验

在xxljob的请求中,权限校验是保存在Cookie中的
在这里插入图片描述

寻找权限校验拦截器,发现是在loginService.ifLogin( )方法中实现了权限校验
在这里插入图片描述

权限校验流程为,从Cookie中获取"XXL_JOB_LOGIN_IDENTITY"的值作为token,然后解析token,再检查密码是否匹配
在这里插入图片描述
在这里插入图片描述

2. 修改校验流程

2.1 XxlJobRemotingUtil.postBody( )

在xxl-job-core模块里有关于远程发送请求的工具类方法postBody( )
在这里插入图片描述
在这里插入图片描述这个方法的大概内容就是:发送一个HTTP POST请求,将token设置在Header里,key为"XXL-JOB-ACCESS-TOKEN",将请求参数设置在RequestBody里面。与在调度平台中发送的请求的区别为:1. 调度平台将token设置在Cookie里,key为"XXL_JOB_LOGIN_IDENTITY";2. 调度平台将请求参数放在了url上,没有放在RequestBody。

2.2 修改校验流程并测试

在后续改动中,我们会使用XxlJobRemotingUtil.postBody( )方法去发送请求添加任务,这个方法不需要Cookie,将token从Cookie转到了"XXL-JOB-ACCESS-TOKEN"中,因此对权限校验流程作以下修改:
在这里插入图片描述
这样,远程请求将token保存在"XXL-JOB-ACCESS-TOKEN"中,而调度平台发送的请求保存在Cookie中,权限校验对两个类型的请求都生效。
在postman中测试:
在这里插入图片描述

3. 远程添加

3.1 添加一个远程add任务的方法

在这里插入图片描述

3.2 测试

仿照add请求中的参数
在这里插入图片描述

使用postman
在这里插入图片描述
在这里插入图片描述
使用XxlJobRemotingUtil.postBody( )
在这里插入图片描述这里需要改一下才不会报错,其中content是任务id

ReturnT returnT = GsonTool.fromJson(resultJson, ReturnT.class, returnTargClassOfT);
//改为
ReturnT returnT = GsonTool.fromJson(resultJson, ReturnT.class);

在这里插入图片描述

4. 封装XxlJobRemoteApi

XxlJobRemotingUtil.postBody( )不好用,只能支持post请求,因此自己封装一套远程调用xxljob的api

@Component
public class XxlJobRemoteApi {

    @Autowired
    private RestTemplate restTemplate;
    

    /****
     * 添加任务
     */
    public void addJob(String cron,Integer id,String taskName){
        //1)将数据封装成Map   Map->XxlJobInfo
        Map<String,Object> dataMap = new HashMap<String,Object>();
        dataMap.put("jobGroup",1);
        dataMap.put("jobDesc","动态定时任务作业");
        dataMap.put("author","张三");
        dataMap.put("scheduleType","CRON");
        //执行时间
        dataMap.put("scheduleConf",cron);  //动态的
        dataMap.put("cronGen_display",cron);  //动态的
        dataMap.put("glueType","BEAN");
        //哪个任务
        dataMap.put("executorHandler",taskName); //动态的
        dataMap.put("executorParam",id);  //订单ID
        dataMap.put("executorRouteStrategy","FIRST");
        dataMap.put("misfireStrategy","DO_NOTHING");
        dataMap.put("executorBlockStrategy","SERIAL_EXECUTION");
        dataMap.put("executorTimeout",0);
        dataMap.put("executorFailRetryCount",0);
        dataMap.put("glueRemark","GLUE代码初始化");


        //2)XxlJobRemotingUtil实现远程调用
        // url  、参数 、accessToken
        String url = "http://localhost:8080/xxl-job-admin/jobinfo/json/add";
        String token ="7b226964223a312c22757365726e616d65223a2261646d696e222c2270617373776f7264223a226531306164633339343962613539616262653536653035376632306638383365222c22726f6c65223a312c227065726d697373696f6e223a6e756c6c7d";
        ReturnT returnT = XxlJobRemotingUtil.postBody(
                url,    //请求地址
                token,  //令牌信息
                10,
                dataMap,
                ReturnT.class);//返回数据转换对象
        System.out.println(returnT);
    }


    /***
     * 删除任务
     *  http://localhost:8080/xxl-job-admin/jobinfo/delete/{id}
     *
     * @param id:xxl-job中的任务id
     */
    public void removeJob(Integer id){
        //restTemplate.delete("http://localhost:8080/xxl-job-admin/jobinfo/delete/"+id);
        Map<String,Object> dataMap = new HashMap<String,Object>();
        String url ="http://localhost:8080/xxl-job-admin/jobinfo/delete/"+id;
        Map<String,Object> headers = new HashMap<String,Object>();
        headers.put("XXL-JOB-ACCESS-TOKEN","7b226964223a312c22757365726e616d65223a2261646d696e222c2270617373776f7264223a226531306164633339343962613539616262653536653035376632306638383365222c22726f6c65223a312c227065726d697373696f6e223a6e756c6c7d");
        remote(url,headers,dataMap,HttpMethod.DELETE);
    }


    /***
     * 抽取远程调用
     * @param url 远程请求地址
     * @param headers 请求头数据
     * @param dataMap 请求参数
     */
    public void remote(String url, Map<String,Object> headers,Map<String, Object> dataMap,HttpMethod method){
        // 请求头参数
        HttpHeaders requestHeaders = new HttpHeaders();
        for (Map.Entry<String, Object> entry : headers.entrySet()) {
            requestHeaders.set(entry.getKey(),entry.getValue().toString());
        }

        // 请求体封装
        HttpEntity<Object> requestEntity = new HttpEntity<>(requestHeaders);

        // 请求回调
        RequestCallback requestCallback = restTemplate.httpEntityCallback(requestEntity);

        // 第三方返回结果提取
        ResponseExtractor<ResponseEntity<String>> responseExtractor = restTemplate.responseEntityExtractor(String.class);

        // 执行
        ResponseEntity<String> response = restTemplate.execute(url, method, requestCallback, responseExtractor, dataMap);

        //响应的数据
        String body = response.getBody();
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Blink基准测试:挑战多模态大型语言模型的视觉感知能力

随着人工智能技术的飞速发展&#xff0c;多模态大型语言模型&#xff08;LLMs&#xff09;在理解和生成文本方面取得了显著成就。然而&#xff0c;这些模型在核心视觉感知任务上的表现仍远落后于人类。本文介绍了Blink基准测试&#xff0c;这是一套针对多模态LLMs的视觉感知能力…

Leetcode:寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 题目分析 1、当只有一个有序数组时&#xff0c;该数组的中位数会将该数组分为两份&#xff1a;左子数组 和 右子数组 2、当有两个有序数组时&#xff0c; 我们仍然可以通过一条分隔…

第5章 锁与进程间通信(3)

目录 5.4 其他IPC机制 5.4.1 信号 5.4.2 管道和套接字 5.5 小结 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 5.4 其他IPC机制 5.4.1 信号 kill命令&#xff1a; 作用&#xff1a;发送指定信号。 信号分为&#xff1a; 传统32个信号。 用于实…

【机器学习】Samba-CoE实现高效推理部署

Samba-CoE&#xff1a;突破AI内存墙&#xff0c;实现高效推理部署 一、引言二、Samba-CoE系统概述三、突破AI内存墙的关键技术流数据流三层内存系统 四、Samba-CoE的推理部署与优化动态模型切换资源优化分配性能加速 五、代码实例与实现细节六、结语 一、引言 随着人工智能技术…

es的总结

es的collapse es的collapse只能针对一个字段聚合&#xff08;针对大数据量去重&#xff09;&#xff0c;如果以age为聚合字段&#xff0c;则会展示第一条数据&#xff0c;如果需要展示多个字段&#xff0c;需要创建新的字段&#xff0c;如下 POST testleh/_update_by_query {…

2024-05-31 blue-VH-driver-问题分析-有状态的服务-状态的处理

摘要: VH的driver对上层提供的接口&#xff0c;是会保持状态。这个状态&#xff0c;可以分为&#xff0c;查询的数据的状态&#xff0c;主要是为了提供翻页查询的功能。另一种状态&#xff0c;就是订阅。 有状态的服务: 状态是什么? 其实从调用方的角度更好的理解&#xff0c…

AIGC绘画设计——Stable Diffusion进阶使用

&#xfeff;本文讲解&#xff0c;模型底模&#xff0c;VAE美化模型&#xff0c;Lora模型&#xff0c;hypernetwork。 文本Stable Diffusion 简称sd 欢迎关注留言&#xff0c;不定期追加更新&#xff01; 使用模型 C站&#xff1a;https://civitai.com/ huggingface&#…

快团团大团长帮卖团长团长如何获得物流查询码?

一、功能说明 团长可自行生成物流查询码&#xff0c;直接将码发给顾客&#xff0c;顾客扫码可查询自己订单的物流状态&#xff01; 用户扫码后&#xff0c;会出现用户在该团长处下单的所有快递订单。团员可查看该订单物流信息、进行退款申请&#xff0c;或直接联系团长。 二…

使用Python爬取华为市场游戏类APP应用

文章目录 1. 写在前面2. 接口分析3. 爬虫开发4. 下载链接获取 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守…

摘下戛纳大奖的《狗阵》,救得了华谊吗?

随着第77届戛纳国际电影节成功落幕&#xff0c;《狗阵》无疑成为了华语电影的最大赢家。 今年的戛纳电影节可以说是华语电影大年&#xff0c;《风流一代》《狗阵》《酱园弄》《九龙城寨之围城》等多部重量级影片亮相戛纳。 但最终抱得奖项而归的只有管虎导演的《狗阵》&#…

长虹55D3P海思平台固件破解

一 、背景 目前网上还没有长虹海思平台智能电视的固件打包解包教程&#xff0c;仅有一个znds的解包&#xff0c;但大佬迟迟没更新打包教程和工具。帖子中也没讲解解包的原理&#xff0c;对于不熟悉海思平台的来说&#xff0c;感觉无从下手。 znds海思解包贴&#xff1a;#长虹…

Vue 2.0使用Vue-count-to给数字添加增长动画

在开发后台管理系统时&#xff0c;时常会遇到数据汇总&#xff0c;为了页面展示更生动&#xff0c;用户体验更好&#xff0c;通常会对汇总的数字加一个逐步递增动画。 实现这个效果一般是用的 Vue-count-to这个插件&#xff0c;这是一款简单好用的一个数字滚动插件&#xff0c;…

3D视觉系统实现自动化上下料操作

在竞争激烈的汽车制造行业&#xff0c;提高生产效率、降低成本并保证产品质量是企业持续发展的关键。特别是在汽车制造过程中&#xff0c;各种零部件的上下料操作占据了大量的生产时间&#xff0c;因此如何实现这些操作的自动化、高效化成为了一个亟待解决的问题。 富唯智能3D视…

157.二叉树:二叉树的右视图(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

【C++修行之道】类和对象(二)类的6个默认成员函数、构造函数、析构函数

目录 一、类的6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.2.5 自动生成默认构造函数 不进行显示定义的隐患&#xff1a; 2.2.6 自动生成的构造函数意义何在&#xff1f; 两个栈实现一个队列 2.2.7 无参的构造函数和全缺省的构造函数都称为默认构造函数&#x…

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑位置快捷键&#xff1a; pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑…

Minio篇:初识MinIO

1. MinIO快速入门 1.1.MinIO核心概念 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 对象&#xff08;Object&#xff09; 对象是实际的数据单元&#xff0c;例如我们上传的一个图片。 存储桶&#xff08;Bucket&#xff09; 存储…

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…

原生小程序一键获取手机号

1.效果图 2.代码index.wxml <!-- 获取手机号 利用手机号快速填写的功能&#xff0c;将button组件 open-type 的值设置为 getPhoneNumber--><button open-type"getPhoneNumber" bindgetphonenumber"getPhoneNumber">获取手机号</button> …

Javaweb基础之Cookie会话技术

大家好&#xff0c;这里是教授.F 引入&#xff1a; 我们想在登录一个网站时&#xff0c;能够显示我们上一次的登录时间啊&#xff0c;或者我们在该网站的浏览痕迹。哪这些要怎么做到&#xff1f;我们想&#xff0c;这些数据不可能从服务端给你返回来&#xff0c;因为一旦用户…