Java使用XXL-Job-Admin创建和管理调度任务的指南

news2024/11/13 15:53:12

文章目录

        • 一、调度中心添加任务的基本方法
        • 二、配置文件中的任务配置
        • 三、创建并调用调度任务的客户端
        • 四、配置RestTemplate
      • 总结

在日常开发中,我们经常需要处理各种定时任务,而XXL-Job作为一款强大的分布式任务调度平台,为我们提供了简单易用的任务管理功能。在本文中,我将带你一步步了解如何通过XXL-Job-Admin来创建和管理调度任务,并结合代码实例帮助你快速上手。

一、调度中心添加任务的基本方法

在XXL-Job的管理控制台中,我们可以通过xxl-job-admin提供的API来进行任务的增删改查操作。以下是几个基本的任务管理方法:

// 添加任务
@RequestMapping("/addJob")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<String> addJobInfo(@RequestBody XxlJobInfo jobInfo) {
   return xxlJobService.add(jobInfo);
}

// 删除任务
@RequestMapping("/removeJob")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<String> removeJob(@RequestBody XxlJobInfo jobInfo) {
   return xxlJobService.remove(jobInfo.getId());
}

// 修改任务
@RequestMapping("/updateJob")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<String> updateJob(@RequestBody XxlJobInfo jobInfo) {
   return xxlJobService.update(jobInfo);
}

// 停止任务
@RequestMapping("/stopJob")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<String> pauseJob(@RequestBody XxlJobInfo jobInfo) {
   return xxlJobService.stop(jobInfo.getId());
}

// 启动任务
@RequestMapping("/startJob")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<String> startJob(@RequestBody XxlJobInfo jobInfo) {
   return xxlJobService.start(jobInfo.getId());
}

// 添加并启动任务
@RequestMapping("/addAndStartJob")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<String> addAndStartJob(@RequestBody XxlJobInfo jobInfo) {
   ReturnT<String> result = xxlJobService.add(jobInfo);
   int id = Integer.parseInt(result.getContent());
   xxlJobService.start(id);
   JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, jobInfo.getExecutorParam(), "");
   return result;
}

这些方法分别对应了添加任务、删除任务、修改任务、停止任务、启动任务以及添加并启动任务的功能。通过这些API,我们可以灵活地在XXL-Job中管理自己的调度任务。

二、配置文件中的任务配置

在实际开发中,我们通常会将一些任务的配置写入配置文件,以便于管理。在使用nacos配置中心的项目中,我们可以在service-dispatch-dev.yaml文件中添加相关的调度任务配置,如下图所示:

在这里插入图片描述

这些配置将用于我们在代码中调用相应的调度任务方法。

三、创建并调用调度任务的客户端

为了更方便地调用调度任务的方法,我们可以在项目中创建一个配置类XxlJobClientConfig,用于读取配置文件中的任务操作方法。

@Data
@Component
@ConfigurationProperties(prefix = "xxl.job.client")
public class XxlJobClientConfig {
    private Integer jobGroupId;
    private String addUrl;
    private String removeUrl;
    private String startJobUrl;
    private String stopJobUrl;
    private String addAndStartUrl;
}

接下来,我们还需要创建一个客户端类XxlJobClient,用来编写调用调度中心方法的具体逻辑:

@Slf4j
@Component
@RequiredArgsConstructor
public class XxlJobClient {
    private final XxlJobClientConfig xxlJobClientConfig;
    // 客户端调用服务端里面的方法
    private final RestTemplate restTemplate;

    @SneakyThrows
    public Long addJob(String executorHandler, String param, String corn, String desc) {
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setJobGroup(xxlJobClientConfig.getJobGroupId());
        xxlJobInfo.setJobDesc(desc);
        xxlJobInfo.setAuthor("qy");
        xxlJobInfo.setScheduleType("CRON");
        xxlJobInfo.setScheduleConf(corn);
        xxlJobInfo.setGlueType("BEAN");
        xxlJobInfo.setExecutorHandler(executorHandler);
        xxlJobInfo.setExecutorParam(param);
        xxlJobInfo.setExecutorRouteStrategy("FIRST");
        xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION");
        xxlJobInfo.setMisfireStrategy("FIRE_ONCE_NOW");
        xxlJobInfo.setExecutorTimeout(0);
        xxlJobInfo.setExecutorFailRetryCount(0);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<XxlJobInfo> request = new HttpEntity<>(xxlJobInfo, headers);

        String url = xxlJobClientConfig.getAddUrl();
        ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, request, JSONObject.class);

        if (response.getStatusCode().value() == 200 && response.getBody().getIntValue("code") == 200) {
            log.info("增加xxl执行任务成功,返回信息:{}", response.getBody().toJSONString());
            // content为任务id
            return response.getBody().getLong("content");
        }
        log.info("调用xxl增加执行任务失败:{}", response.getBody().toJSONString());
        throw new GuiguException(ResultCodeEnum.DATA_ERROR);
    }

    public Boolean startJob(Long jobId) {
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setId(jobId.intValue());

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<XxlJobInfo> request = new HttpEntity<>(xxlJobInfo, headers);

        String url = xxlJobClientConfig.getStartJobUrl();
        ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, request, JSONObject.class);
        if (response.getStatusCode().value() == 200 && response.getBody().getIntValue("code") == 200) {
            log.info("启动xxl执行任务成功:{},返回信息:{}", jobId, response.getBody().toJSONString());
            return true;
        }
        log.info("启动xxl执行任务失败:{},返回信息:{}", jobId, response.getBody().toJSONString());
        throw new GuiguException(ResultCodeEnum.DATA_ERROR);
    }

    public Boolean stopJob(Long jobId) {
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setId(jobId.intValue());

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<XxlJobInfo> request = new HttpEntity<>(xxlJobInfo, headers);

        String url = xxlJobClientConfig.getStopJobUrl();
        ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, request, JSONObject.class);
        if (response.getStatusCode().value() == 200 && response.getBody().getIntValue("code") == 200) {
            log.info("停止xxl执行任务成功:{},返回信息:{}", jobId, response.getBody().toJSONString());
            return true;
        }
        log.info("停止xxl执行任务失败:{},返回信息:{}", jobId, response.getBody().toJSONString());
        throw new GuiguException(ResultCodeEnum.DATA_ERROR);
    }

    public Boolean removeJob(Long jobId) {
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setId(jobId.intValue());

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<XxlJobInfo> request = new HttpEntity<>(xxlJobInfo, headers);

        String url = xxlJobClientConfig.getRemoveUrl();
        ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, request, JSONObject.class);
        if (response.getStatusCode().value() == 200 && response.getBody().getIntValue("code") == 200) {
            log.info("删除xxl执行任务成功:{},返回信息:{}", jobId, response.getBody().toJSONString());
            return true;
        }
        log.info("删除xxl执行任务失败:{},返回信息:{}", jobId, response.getBody().toJSONString());
        throw new GuiguException(ResultCodeEnum.DATA_ERROR);
    }

    // 添加并启动任务
    public Long addAndStart(String executorHandler, String param, String corn, String desc) {
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setJobGroup(xxlJobClientConfig.getJobGroupId());
        xxlJobInfo.setJobDesc(desc);
        xxlJobInfo.setAuthor("qy");
        xxlJobInfo.setScheduleType("CRON");
        xxlJobInfo.setScheduleConf(corn);
        xxlJobInfo.setGlueType("BEAN");
        xxlJobInfo.setExecutorHandler(executorHandler);
        xxlJobInfo.setExecutorParam(param);
        xxlJobInfo.setExecutorRouteStrategy("FIRST");
        xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION");
        xxlJobInfo.setMisfireStrategy("FIRE_ONCE_NOW");
        xxlJobInfo.setExecutorTimeout(0);
        xxlJobInfo.setExecutorFailRetryCount(0);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<XxlJobInfo> request = new HttpEntity<>(xxlJobInfo, headers);

        // 获取调度中心请求路径
        String url = xxlJobClientConfig.getAddAndStartUrl();

        // restTemplate
        ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, request, JSONObject.class);
        if (response.getStatusCode().value() == 200 && response.getBody().getIntValue("code") == 200) {
            log.info("增加并开始执行xxl任务成功,返回信息:{}", response.getBody().toJSONString());
            // content为任务id
            return response.getBody().getLong("content");
        }
        log.info("增加并开始执行xxl任务失败:{}", response.getBody().toJSONString());
        throw new GuiguException(ResultCodeEnum.DATA_ERROR);
    }
}

通过这个客户端类,我们可以更方便地调用XXL-Job的任务管理接口,轻松实现任务的添加、启动、停止、删除等操作。

四、配置RestTemplate

最后,为了让客户端能够发起HTTP请求,我们还需要在项目的启动类中配置RestTemplate

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

配置完成后,我们就可以通过RestTemplate来与XXL-Job-Admin进行通信了。

总结

通过以上步骤,我们可以轻松地在项目中集成XXL-Job,并通过客户端类来方便地管理调度任务。XXL-Job为我们提供了强大的任务调度功能,而合理的封装和配置则让这些功能更加易于使用和维护。希望这篇博客能帮助你更好地掌握XXL-Job的使用,提升项目的开发效率。

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

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

相关文章

进程与线程(6)

有名管道&#xff1a; 目录 有名管道&#xff1a; 1.创建&#xff08;mkfifo&#xff09;&#xff1a; 2。打开&#xff08;open&#xff09;&#xff1a; 3.读写&#xff08;read /write&#xff09;&#xff1a; 4.关闭&#xff08;close&#xff09;&#xff1a; 5.卸…

presto高级用法(grouping、grouping sets)

目录 准备工作&#xff1a; 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 ​编辑 按照爱好分组 统计人数 ​编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案

【Qt开发】创建并打开子窗口&#xff08;QWidget&#xff09;的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案 文章目录 新建QWidget测试注意事项不要用多线程方式运行子窗口不要在打开子窗口后用阻塞死等不要用临时变量定义子窗口 禁止其他窗口的点击隐…

【Qt】常用控件QPushButton

常用控件QPushButton QWidget中涉及的各种属性/函数/使用方法&#xff0c;对Qt中的各种控件都是有效的。 QPushButton继承自QAbstractButton。这个类是抽象类&#xff0c;是其他按钮的父类。 QAbstractButton中和QPushButton相关性比较大的属性。 属性说明 text 按钮中的⽂本…

Vue中下载内容为word文档

1.使用 html-docx-js&#xff1a;这是一个将 HTML 转换为 Word 文档的库。 2. 利用 Blob 和 FileSaver.js&#xff1a;创建并下载生成的 Word 文档。 在 Vue.js 中实现步骤如下: 1. npm 安装 html-docx-js 和 file-saver npm install html-docx-js npm install file-saver2.…

CAS-ViT:面向高效移动应用的卷积加性自注意力视觉Transformer

摘要 https://arxiv.org/pdf/2408.03703 视觉转换器&#xff08;Vision Transformers&#xff0c;ViTs&#xff09;以其标记混合器强大的全局上下文能力&#xff0c;在神经网络领域取得了革命性的进展。然而&#xff0c;尽管以往的工作已做出相当大的努力&#xff0c;但成对标…

终于来了!中国首个接入大模型的Linux开源操作系统正式发布!

在AI飞速发展的今天&#xff0c;谁不希望自己的电脑里住着一个AI助手&#xff0c;我们动动嘴皮子就能指挥电脑干活&#xff0c;省时省力&#xff1f;但是Windows Copilot锁了区&#xff0c;很多用户只能“望洋兴叹”。 而现在&#xff0c;国产站出来了&#xff0c;说我们也有A…

Python常用的模块

一、logging模块 一&#xff09;日志级别 critical50 error40 waring30 info20 debug10 notset0 二&#xff09;默认的日志级别是waring&#xff08;30&#xff09;&#xff0c;默认的输出目标是终端 logging输出的目标有两种&#xff1a;1、终端&#xff1b;2、文件 高于warn…

如何查看麒麟系统下的CPU信息

如何查看麒麟系统下的CPU信息 一、使用lscpu命令二、使用cat /proc/cpuinfo命令 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在麒麟&#xff08;Kylin&#xff09;Linux系统中&#xff0c;了解CPU的详细信息对于系统性能调优、故障诊断以…

转债违约,是实体经济高质量发展的一大步?

8月14日&#xff0c;岭南股份公告其发行的可转债无法按期兑付&#xff0c;出现实质违约。8月16日&#xff0c;证券时报发表了一篇“雄文”《国企可转债的刚兑信仰该放下了》&#xff0c;引爆了舆论。 文章内容总结下&#xff0c;就是对投资者一顿批评教育&#xff0c;批评投资者…

leetcode-461. 汉明距离

题目描述 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0) …

Spring7中事务传播机制形象图解

一、Spring的7种事务传播机制 Spring事务传播机制是指在多个事务方法相互调用的情况下&#xff0c;事务如何在方法之间进行传播和管理的机制。通过事务传播机制&#xff0c;可以控制事务的范围和行为&#xff0c;保证多个事务方法的一致性和完整性。Spring提供了七种事务传播行…

Linux系统挂载U盘方法

第一步&#xff1a; 插入U盘&#xff0c;如果能够识别出U盘&#xff0c;则会**出一些信息 第二步&#xff1a; 查看U盘系统分配给U盘的设备名&#xff1b;输入如下命令进行查看&#xff1a; 使用fdisk -l命令查看一下U盘是否有被识别到&#xff0c;及识别的U盘是在哪个位置 …

8.15 day bug

bug1 一个按钮折腾了 两个小时 一直点第一个按钮&#xff0c;然后进去后发现根本没有课程&#xff0c;需要创建workspace&#xff0c;然后各种问题&#xff0c;还是没把课程启动起来&#xff0c;然后去看gitpod使用文档&#xff0c;搞懂工作区到底是怎么回事&#xff0c;一通操…

实用篇| 如何快速搭建“二手系统”的数据库

对于一些程序员最痛苦的是接手一些“二手系统“&#xff0c; 由于年久失修&#xff0c; 加上裁员离职&#xff0c;系统文档不完善等原因&#xff0c; 只留下服务器配置和代码。 接手人&#xff0c;只能对着这些仅存的代码和服务器硬刚&#xff0c; 对服务器硬刚的第二步&#x…

Golang | Leetcode Golang题解之第343题整数拆分

题目&#xff1a; 题解&#xff1a; func integerBreak(n int) int {if n < 3 {return n - 1}quotient : n / 3remainder : n % 3if remainder 0 {return int(math.Pow(3, float64(quotient)))} else if remainder 1 {return int(math.Pow(3, float64(quotient - 1))) * …

学习日志--NAT(Network Address Translation)网络地址转换

目录 一、什么是NAT网络地址转换 二、配置并检查实验环境 三、NAT实现原理 四、NAT实现静态配置一对一 五、NAT实现动态配置一对一 六、PAT端口地址转换一对多 七、NAT优化easyIP的问题 八、NAT网络地址转换PAT多对多转换&#xff08;特殊情况&#xff09; 九、NAT---…

【Harmony OS 4.0】从零开始,快速上手

2019年8月份Harmony OS 1.0&#xff0c; 2020年9月份Harmony OS 2.0 2022年7月份Harmony OS 3.0 2023年3月份Harmony OS 4.0&#xff0c;不兼容 android app 1. 快速上手 1.1 下载并安装 DevEco Studio 1.2 创建项目并初始化 项目 build init 时报错&#xff1a;request to h…

产业经济大脑建设方案(三)

为了加速产业经济的智能化转型&#xff0c;我们建议建立一个全面集成的产业经济大脑系统&#xff0c;该系统结合人工智能、大数据分析和云计算技术&#xff0c;构建数据驱动的决策支持平台。该平台将实时采集和处理产业链各环节的数据&#xff0c;利用智能算法进行深度分析和预…

【C++】C++11新增特性

目录 C11简介&#xff1a; 1、统一的列表初始化&#xff1a; std::initializer_list 2、自动类型推导&#xff1a; auto&#xff1a; decltype&#xff1a; 3、final 和 override final&#xff1a; override&#xff1a; 4、默认成员函数控制&#xff1a; 显示缺省…