当前位置: 首页 > news >正文

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

如果你看官方文档,在研究透,至少也得几天时间,如果你直接看我的文档,快速用到项目中,也就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;@Autowiredprivate 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);//第一步,创建执行器返回的executorIdmap.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);//第二步,创建任务返回的taskIdxxlJobClient.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);//第二步,创建任务返回的taskIdxxlJobClient.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);//第二步,创建任务返回的taskIdxxlJobClient.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);//第二步,创建任务返回的taskIdxxlJobClient.xxlJobPost(Constants.XXL_JOB_URL.EXECUTOR_DELETE,map);return "停止成功";}
}

执行器注册代码

@Beanpublic 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

相关文章:

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

如果你看官方文档&#xff0c;在研究透&#xff0c;至少也得几天时间&#xff0c;如果你直接看我的文档&#xff0c;快速用到项目中&#xff0c;也就10分钟就搞好了。 xxl-job功能确实很强大&#xff0c;而且使用的人比较多&#xff0c;既然在使用xxl-job&#xff0c;那肯定是…...

Qt生成PDF报告

文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…...

Jenkins 安装全攻略:从入门到精通

目录 一&#xff1a;安装文件夹准备 1.打开&#xff0c;/home/admin目录 2.新建三个文件夹 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三&#xff1a;安装Maven 1.打开maven目录进行…...

迎重阳,话养老:平安养老险如何助力国民“养老梦”?

10月23日&#xff0c;我们将迎来传统节日重阳节&#xff0c;又称敬老节&#xff0c;自古就有祭祖、登高、赏菊三大风俗&#xff0c;流传至今&#xff0c;已成为人们孝老敬老的重要节日。 随着老龄化日益加深&#xff0c;在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...

微信小程序获取用户信息

个人博客 微信小程序获取用户信息 个人微信公众号&#xff0c;求关注&#xff0c;求收藏&#xff0c;求指错。 文章概叙 本文主要讲的是小程序获取用户信息的&#xff0c;更新测试时间是2023-10-25 更改原因 首先&#xff0c;官网上的解释是这样的&#xff0c;为了安全合…...

Mysql 索引原理和优化方式

一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 &#xff08;1&#xff09; Hash 索引 Hash 索引是比较常见的一种索引&#xff0c;他的单条记录查询的效率很高&#xff0c;时间复杂度为1。但是&#xff0c…...

Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题

1&#xff1a;首先使用VMware Workstation安装一个Ubuntu的系统。 2&#xff1a;现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3&#xff1a;进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4&#xff1a;提示下面错误&#xff0c;Package open-vm…...

【Docker】Docker Swarm介绍与环境搭建

为什么不建议在生产环境中使用Docker Compose 多机器如何管理&#xff1f;如何跨机器做scale横向扩展&#xff1f;容器失败退出时如何新建容器确保服务正常运行&#xff1f;如何确保零宕机时间&#xff1f;如何管理密码&#xff0c;Key等敏感数据&#xff1f; Docker Swarm介…...

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps CAN FD 灵活数据速率&#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传输的能力&#xff0c;完全兼容“ISO…...

[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构

目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图&#xff0c;是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...

【接口技术】定时计数器习题

1&#xff1a;8253芯片有______个端口地址。 【可选】 2 3 4 6 解答&#xff1a;4 2&#xff1a;8253芯片有______种工作方式。 【可选】 3 4 5 6 解答&#xff1a;6 3&#xff1a; 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...

DC电源模块的的散热结构合理布局

BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而&#xff0c;随着功率密度不断提高&#xff0c;DC电源模块产生的热量也越来越大&#xff0c;散热问题变得越来越突出。为了保障电路的稳定性和可靠性&#xff0c;必须采取合…...

Fedora Linux 38下安装音频与视频的解码器和播放器

Fedora Linux 38 操作系统安装好后&#xff0c;默认是没有音频与视频的解码器的&#xff0c;音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件&#xff0c;需要我们自己手动安装。、 连接互联网&#xff0c;打开Shell命令行&#xff1a; 1. sudo d…...

边缘计算:云计算的延伸

云计算已经存在多年&#xff0c;并已被证明对大大小小的企业都有好处&#xff1b;然而&#xff0c;直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理&#xff0c;更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...

【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

引言 openGauss是一款开源的关系型数据库管理系统&#xff0c;它提供了强大的功能和性能&#xff0c;可以满足各种企业级应用的需求。与此同时&#xff0c;ODBC&#xff08;Open Database Connectivity&#xff09;是一个标准的数据库访问接口&#xff0c;它允许应用程序通过统…...

WSL——ubuntu中anaconda换源(conda、pip)

1、conda 打开Ubuntu&#xff0c;输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏&#xff0c;输入&#xff1a;\\wsl$。打开Ubuntu根路径&#xff0c;其中显示了.condarc文件。 以文本形式打开&#xff0c;并输入要换的源&#xff0c;保存即可。…...

IP地址在网络安全中的关键作用

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网世界中的重要标识符&#xff0c;它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此&#xff0c;还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...

Android.mk 中覆盖应用包名

项目场景&#xff1a; 一般来讲应用包名都是配置在 AndroidManifest.xml 中的&#xff0c;但遇到特殊情况&#xff0c;需要修改源码中应用包名 通常都会先去改 AndroidManifest.xml package 但改为后编译发现一顿错误&#xff0c;原因是 java 类中已经指定了 R 文件包名&…...

如何最有效地使用ChatGPT:提问技巧与策略

前言 在如今信息技术高速发展的时代&#xff0c;像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具&#xff0c;以获取各种信息和答案。然而&#xff0c;要充分利用这一工具&#xff0c;您需要掌握一些提问技巧与策略&#xff0c;以确保获得最准确和有用的回答。…...

【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_ 一、抽象类的引入 很多时候在创建类的时候有一个父类&#xff0c;比如animal类&#xff0c;他的子类会有各种方法&#xff0c;为了复用需要进行方法的重写&…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...