xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中

news2024/11/24 22:26:18

如果你看官方文档,在研究透,至少也得几天时间,如果你直接看我的文档,快速用到项目中,也就10分钟就搞好了。

xxl-job功能确实很强大,而且使用的人比较多,既然在使用xxl-job,那肯定是基于定时任务比较多,不方便管理,才使用它,让定时任务成为一个独立的服务,其它任务可以快速的使用。

但xxl-job也有自己的问题,问题如下:

1、配置执行器、配置任务,只能在管理界面去操作;也就是说,我如果要使用xxl-job,我代码写好了,还需要手动去xxl-job-admin管理页面手动去配置执行器、配置任务,而且官方文档也没有说通过代码接口的方式创建执行器及任务,这就非常不爽了,我们既然在使用你,那说明我们的定时任务非常多,想快速的集成进来,通过代码自动创建执行器和任务,不要手动去配置。

所以基于上面原因,在实际项目上的使用,本文件就要解决上面的问题,通过代码全自动集成到项目中

在介绍之前,先简单讲一下xxl-job的原理,不是官方一大堆文字,这里说的都是直白话,方便你快速明白如何使用;

1、有两个系统,任务调度中心(xxl-job官方提供)、业务系统(您自己的)

2、使用xxl-job分4步:

(1)在任务调度中心创建执行器(说直白点,就是业务系统在任务调度中心进行一个注册,类似于注册中心)

(2)在任务调度中心创建任务(这个任务,主要是根据cron表达式,定时来调用你的业务系统)

(3)业务系统写代码,先注册,后通过@XxlJob来实现定时任务的具体逻辑,后面会详讲

(4)在任务调度中心启动任务

本文所涉及到的代码会放在文章最后面,欢迎下载;压缩包中有两个工程,分别为xxl-job-admin(官方任务调度中心)、xxl-job-soft(你自已的业务系统),所以本文先介绍启动xxl-job-admin,再介绍xxl-job-soft代码集成,本文xxl-job版本号为:2.4.0

一、xxl-job-admin任务调度中心的环境搭建

1、在xxl-job-admin工程里有一个doc的文件夹,里面有一个tables_xxl_job.sql的数据库脚本文件,直接在mysql数据库上执行,执行完就会创建一个xxl-job的数据库

2、idea打开xxl-job-admin工程,修改application.properties里面的数据库配置,如下:

### web
server.port=8080
server.servlet.context-path=/xxl-job-admin

### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false

### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://192.168.137.202:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000

### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### xxl-job, access token
xxl.job.accessToken=default_token

### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN

## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100

### xxl-job, log retention days
xxl.job.logretentiondays=30

3、运行XxlJobAdminApplication.java,服务就启动了,在页面访问:http://localhost:8080/xxl-job-admin

默认用户名为admin,密码为123456

二、xxl-job-soft工程的使用,代码集成xxl-job

说明:xxl-job-soft中的TaskController,里面方法,使用了Map,这是硬编码,实际项目上不要这样用,这只是为了方便看到向xxl-job-admin请求传参,创建执行器和任务等的方便,你主要是要关心创建执行器后返回的executorId(执行器id)和创建任务返回的taskId(任务id),这两个id需要您存储到你的业务数据库,方便后面,比如启动任务、停止任务、删除任务等等使用;

代码集成也和上面说的原理一样,分4步,分别为:

第一步:创建执行器
第二步:创建任务
第三步,业务执行代码和注册
第四步:启动任务

服务启动,运行XxlJobExecutorApplication.java,打开页面

http://localhost:8081/ck/swagger-ui.html

controller代码

@RestController
@RequestMapping("/task")
@Api(tags = "TaskController", description = "任务管理")
public class TaskController {

    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Autowired
    private XxlJobClient xxlJobClient;

    @GetMapping("/createExecutor")
    @ApiOperation("第一步:创建执行器")
    public String createExecutor(String title) {
        Map<String,Object> map = new HashMap<>();
        map.put("title",title);
        map.put("appname",appname);
        map.put("addressType",0);
        String info = xxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.EXECUTOR_CREATE,map);//返回执行器id,删除执行器时,要用此id,根据你的业务保存在业务库
        String executorId = xxlJobClient.getContent(info);
        System.out.println("执行器Id:"+executorId);
        return "执行器Id:"+executorId;
    }

    @GetMapping("/createTask")
    @ApiOperation("第二步:创建任务")
    public String createTask(@ApiParam(value = "执行器Id")@RequestParam String executorId,
                             @ApiParam(value = "任务名称")@RequestParam String jobDesc,
                             @ApiParam(value = "cron表达式")@RequestParam(defaultValue ="0 * * * * ?" ) String cron,
                             @ApiParam(value = "处理器")@RequestParam(defaultValue ="myHandler" )String executorHandler,
                             @ApiParam(value = "执行参数")@RequestParam String executorParam) {
        Map<String,Object> map = new HashMap<>();
        map.put("jobGroup",executorId);//第一步,创建执行器返回的executorId
        map.put("jobDesc",jobDesc);//任务名称
        map.put("scheduleConf",cron);//0 * * * * ? 每分钟执行一次,自定义
        map.put("cronGen_display",cron);
        map.put("executorHandler",executorHandler);//在第三步,通过 @XxlJob("myHandler")注册的处理器,此处传myHandler,根据自己需要换名称
        map.put("executorParam",executorParam);//此时传的什么值,在第三步,执行时,可以原样获取,获取代码 String param = XxlJobHelper.getJobParam();
        map.put("author","admin");//默认值
        map.put("glueType","BEAN");//默认值
        map.put("scheduleType","CRON");//默认值
        map.put("executorRouteStrategy","FIRST");//默认值
        map.put("misfireStrategy","DO_NOTHING");//默认值
        map.put("executorBlockStrategy","SERIAL_EXECUTION");//默认值
        map.put("executorTimeout","0");//默认值
        map.put("executorFailRetryCount","0");//默认值
        String info = xxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.TASK_CREATE,map);//返回任务id,删除执行器时,要用此id,根据你的业务保存在业务库
        String taskId = xxlJobClient.getContent(info);
        System.out.println("任务Id:"+taskId);
        return "任务Id:"+taskId;
    }

    @GetMapping("/startTask")
    @ApiOperation("第四步:启动任务")
    public String startTask(String taskId) {
        Map<String,Object> map = new HashMap<>();
        map.put("id",taskId);//第二步,创建任务返回的taskId
        xxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.TASK_START,map);
        return "启动成功";
    }

    @GetMapping("/stoptTask")
    @ApiOperation("停止任务")
    public String stoptTask(String taskId) {
        Map<String,Object> map = new HashMap<>();
        map.put("id",taskId);//第二步,创建任务返回的taskId
        xxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.TASK_STOP,map);
        return "停止成功";
    }

    @GetMapping("/deleteTask")
    @ApiOperation("删除任务")
    public String deleteTask(String taskId) {
        Map<String,Object> map = new HashMap<>();
        map.put("id",taskId);//第二步,创建任务返回的taskId
        xxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.TASK_DELETE,map);
        return "停止成功";
    }

    @GetMapping("/deleteExecutor")
    @ApiOperation("删除执行器")
    public String deleteExecutor(String executorId) {
        Map<String,Object> map = new HashMap<>();
        map.put("id",executorId);//第二步,创建任务返回的taskId
        xxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.EXECUTOR_DELETE,map);
        return "停止成功";
    }
}

执行器注册代码

@Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }

定时任务具体的业务代码

//第三步,业务执行代码
    @XxlJob("myHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");
        String param = XxlJobHelper.getJobParam();
        String msg ="收到第二步创建任务时executorParam的参数:"+param+"  当前任务执行结束";
        XxlJobHelper.log(msg);
        System.out.println(msg);
    }
三,测试使用,在swagger中操作

第一步:创建执行器,记住执行器Id返回为2,具体返回多少,根据你自己的执行结果:

在任务调度中心,也可以看到执行器了


第二步:创建任务,任务id为3,并在任务调度中心,查看任务状态是停止状态


第三步,业务执行代码和注册

上面代码已列出


第四步:启动任务

第五步:在业务系统,查看任务是否执行,查看已运行

四、代码下载地址:

链接:https://pan.baidu.com/s/1qZHQmzBF0UrSDHdYobmYlQ?pwd=ka1u 
提取码:ka1u

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

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

相关文章

成为CSS选择器大师,让你的网页瞬间提升品味!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、选…

【SpringCoud】

1,启动各个服务: 2,访问以下地址: http://localhost:5001/product/purchase/1/1/1000 浏览器输出: 控制台输出: 这里随机调用的端口号使用了轮询的方式 从服务治理中心拉去一份服务实例清单,然后通过某种负载均衡的算法选择具体的实例 Product核心逻辑代码: @RestController…

新生儿黄疸:原因、科普和注意事项

引言&#xff1a; 新生儿黄疸是许多新生儿面临的常见情况。虽然它通常是一种暂时的现象&#xff0c;但对于许多父母来说&#xff0c;这可能引发担忧。本文将科普新生儿黄疸的原因&#xff0c;提供相关信息&#xff0c;并为父母和监护人提供注意事项&#xff0c;以帮助他们更好…

如何在 SwiftUI 中创建悬浮操作按钮

文章目录 前言创建悬浮操作按钮悬浮按钮出现在屏幕的最前方悬浮按钮位于屏幕的右下角使悬浮按钮呈现圆形添加阴影总结 前言 悬浮操作按钮&#xff08;Floating Action Button, FAB&#xff09;是一种在 Android 和 Material Design 中使用的 UI 元素。它用于触发特定屏幕的主要…

百度迁徒数据爬虫方法

百度迁徙数据是由百度公司提供的免费开放数据集&#xff0c;主要包含了全国范围内各大城市的每日人口流入流出情况。这些数据来源于百度地图上的用户位置信息&#xff0c;通过计算得到每个小时的流入流出人数&#xff0c;并且可以按照省级、市级等多种维度进行分析。 百度迁徙 …

Modbus转MQTT以太网网关MQT-802主要特点和典型应用

随着社会的快速发展&#xff0c;物联网已经潜移默化地深入工控行业的各个领域&#xff0c;其高效的资源整合和强大的数据采集能力&#xff0c;深受客户的喜爱。上海泗博为实现客户在云端平台接收处理世界万物的信息以及实现远程控制&#xff0c;精心打造一款全新物联网产品&…

制作翻页电子画册,手机观看更快捷

随着科技的发展&#xff0c;便携式翻页电子手册越来越受到人们的青睐。这种电子手册不仅方便携带&#xff0c;而且可以在手机上轻松观看&#xff0c;非常适合那些忙碌的上班族或者学生党。与传统纸质书籍相比&#xff0c;电子手册不仅节省了空间&#xff0c;而且还可以随时随地…

C51--单片机中断

51单片机是单线程模式&#xff0c;需要用到硬件中断。 一、中断系统 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理器CPU正在处理某件事的时候&#xff0c;外界发生了紧急事件请求&#xff0c;要求CPU暂停当前工作&#xff0c;转而去处理这个紧急…

LeetCode刷题---最长回文子串

方法一&#xff1a;暴力破解 class Solution {public String longestPalindrome(String s) {if(s.length()<2){return s;}//最长长度int maxLen0;//保留索引坐标String ans "";for(int i0;i<s.length()-1;i){for(int ji1;j<s.length();j){String strs.subs…

ubuntu 下的 使用anaconda 环境运行python 项目

pycharm部署django项目到云服务器的详细流程_编程网 anaconda 安装环境 ubuntu下Anaconda安装与使用教程_ubuntu 运行anaconda_fakerth的博客-CSDN博客 激活环境 conda activate web_hook_python3.9进入到项目目录 cd /home/web-hook-main查看端口是否被占用 sudo ss …

Spring Boot集成Swagger接口分类与各元素排序问题

在上一篇中我们完成使用JSR-303校验&#xff0c;以及利用Swagger2得到相关接口文档&#xff0c;这节&#xff0c;我们在原先的基础之上&#xff0c;完成Swagger中关于对各个元素之间控制前后顺序的具体配置方法。 Swagger的接口的分组 首先我们需要对Swagger中的接口也就是以…

浅谈wheel滚轮事件

<divonWheel{(ee) > {// new WheelEvent(自定义,e) 获取 e[wheelDelta],e[deltaY] 判断滚轮方向var e new WheelEvent(syntheticWheel,ee)console.log(滚动触发事件, e,ee);console.log(滚动触发事件e.wheelDelta, e[wheelDelta],e[deltaY]);console.log(滚动触发事件e.…

Spirit:继承 gh-ost 灵魂的 MySQL 在线大表变更方案

昨天看到社区发布了一个新的 MySQL 大表变更工具 Spirit。是海外支付巨头 Block 旗下的 Cash App (地位类似于支付宝) 开源的&#xff0c;作者之前也在 PingCAP 工作过。 目前市面上做大表变更的方案有两个&#xff1a; Percona 开源的 pt-online-schema-change&#xff0c;基…

WMS仓储管理系统如何保障仓库的安全性

仓库安全一直以来都是企业运营中的重要一环&#xff0c;而WMS仓储管理系统则可以为仓库安全提供有力的保障。本文将探讨WMS仓储管理系统如何在实际应用中确保仓库的安全性。 WMS管理系统是一种专门用于管理仓库和库存的软件&#xff0c;它可以帮助企业对库存进行跟踪、管理以及…

鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢

近年来&#xff0c;随着全球能源消耗的不断增长和环境问题的日益突出&#xff0c;清洁能源转型成为全球共同关注的话题。中国作为全球最大的能源消费国&#xff0c;也在积极推动能源结构的优化和清洁能源的发展。鼎鑫鸿鄴新能源科技有限公司在推动清洁能源转型方面制定了一系列…

探索 10 个有价值的在线免费设计模板网站

对于许多设计师来说&#xff0c;现成的模板无疑可以大大提高工作效率和质量&#xff0c;特别是在赶上项目过程时。然而&#xff0c;找到合适和免费的模板是另一个问题。在这里&#xff0c;我整理了10个推荐的设计模板网站&#xff0c;希望能对您有所帮助。 1.即时设计 即时设计…

转化率的催化剂:网站客服机器人如何推动企业销售?

随着5G的推广&#xff0c;人工智能技术的普及程度越来越高&#xff0c;人机交互已经成为这个时代的常态&#xff0c;无论是在我们的日常生活中还是在企业服务中都非常常见。如今&#xff0c;无论是营销型企业还是客服型企业&#xff0c;都纷纷采用网站客服机器人服务&#xff0…

研究目标检测的同学看过来:超越YOLOv8!华为提出Gold-YOLO:高效实时

超越YOLOv8&#xff01;华为提出Gold-YOLO&#xff1a;高效实时目标检测器 超越YOLO系列&#xff08;v5、v6、v7、v8&#xff09;&#xff01;Gold-YOLO&#xff1a;一种全新的实时目标检测器&#xff0c;提出一种GD新机制&#xff0c;通过卷积和自注意力操作来实现&#xff0…

Paper - Neural Discrete Representation Learning (VQ-VAE) 论文简读

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133992971 VQ-VAE 是基于变分自编码器&#xff08;VAE&#xff09;的生成模型&#xff0c;可以学习离散的潜在表示。VQ-VAE 的主要创新是引入了一…

【Python】基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 前言一、案例背景二、分析目标三、分析过程四、数据准备4.1 数据探索4.2 缺失值处理 五、属性构造5.1 设备数据5.2 周波数据 六、模型训练七、性能度量文末送书&#xff1a;《Python数据挖掘&#xff1a;入门、进阶与实用案例分析》 前言 本案例将根据已收集到的电力…