Spring Boot 整合xxl-job实现分布式定时任务

xxl-job介绍

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。

设计思想

  • 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。

  • 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。

因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

系统组成

  • 调度模块(调度中心)
    负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
    支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 执行模块(执行器)
    负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
    接收“调度中心”的执行请求、终止请求和日志请求等。

总体架构图

在这里插入图片描述

执行流程

在这里插入图片描述

原理分析

1、执行器的注册和发现
执行器的注册和发现主要是关系两张表:

  • xxl_job_group:每个服务注册的实例列表。
  • xxl_job_registry:执行器的实例表,保存实例信息和心跳信息。

执行器启动线程每隔30秒向注册表xxl_job_registry请求一次,更新执行器的心跳信息,调度中心启动 线程每隔30秒检测一次xxl_job_registry,将超过90秒还没有收到心跳的实例信息从xxl_job_registry删除,并更新xxl_job_group服务的实例列表信息。

2、调度中心调用执行器

调度中心的操作:

调度中心通过循环不停的:

关闭自动提交事务

利用mysql的悲观锁,其他事务无法进入

select * from xxl_job_lock where lock_name = 'schedule_lock' for update

3、读取数据库中的xxl_job_info:记录定时任务的相关信息,该表中有trigger_next_time字段表示下一次任务的触发时间。拿到距离当前时间5s内的任务列表,分为三种情况处理:

  • 对于当前时间-任务的下一次触发时间>5,直接跳过不执行,重置trigger_next_time的时间。(超过5s)

  • 对于任务的下一次触发时间<当前时间<任务的下一次触发时间+5的任务(不超过5s的):

​ 开线程处理执行触发逻辑,根据当前时间更新下一次任务触发时间

​ 如果新的任务下一次触发时间-当前时间<5,放到时间轮中,时间轮是一个map:

 private volatile static Map<Integer, List<Integer>> ringData = new ConcurrentHashMap<>();

​ 根据新的任务下一次触发时间更新下下一次任务触发时间

  • 对于任务的下一次触发时间>当前时间,将其放入时间轮中,根据任务下一次触发时间更新下下一次任务触发时间

4、commit提交事务,同时释放排他锁

5、执行器的操作:

  • 执行器接收到调度中心的调度信息,将调度信息放到对应的任务的等待队列中
  • 执行器的任务处理线程从任务队列中取出调度信息,执行业务逻辑,将结果放入一个公共的等待队列中(每个任务都有一个单独的处理线程和等待队列,任务信息放入该队列中)
  • 执行器有一个专门的回调线程定时批量从结果队列中取出任务结果,并且回调告知调度中心

关于更多的详细介绍推荐阅读官方文档[^1]:

https://www.xuxueli.com/xxl-job/

xxl-job快速入门

Spring Boot集成XXL-JOB 主要需要配置以下两项:

  • 配置运行调度中心(xxl-job-admin)
  • 配置运行执行器项目

项目准备及脚本初始化

从如下代码仓库中下载xxl-job-admin

https://gitee.com/xuxueli0323/xxl-job

在这里插入图片描述

下载完成后使用IDEA打开该项目,进行项目构建。

构建完成后,执行项目的doc/db文件夹下面的tables_xxl_job.sql数据库脚本,进行调度数据库表的初始化。

在这里插入图片描述

1699783089231)

数据表说明
xxl_job_lock任务调度锁表
xxl_job_group执行器信息表,维护任务执行器信息
xxl_job_info调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等
xxl_job_log调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等
xxl_job_log_report调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到
xxl_job_logglue任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能
xxl_job_registry执行器注册表,维护在线的执行器和调度中心机器地址信息
xxl_job_user系统用户表

配置调度中心

修改配置文件,主要配置datasource 以及 email

application.properties

### web
server.port=9100### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/ballcat?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxkfz
spring.datasource.password=xxkfz
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

注:由于小编默认8080端口被占用,这里修改了一下项目的端口号:

server.port=9100

配置完成后启动下面主启动类,启动项目:

XxlJobAdminApplication.java

启动完成后,访问地址为:http://localhost:8080/xxl-job-admin,默认的用户为 admin,密码 123456,即可进入后台管理系统页面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

至此,调度中心配置完成,接下来进行执行器的项目配置。

配置执行器项目(整合Spring Boot项目)

该部分官方已经给出具体的案例,因此我们只需对本案例进行整合或修改即可。

官方案例对应工程:xxl-job-executor-sample-springboot

引入依赖
<!-- xxl-job-core -->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>${project.parent.version}</version>
</dependency>

注:此处版本要与 xxl-job-admin 中版本保持一致!

引入配置类

XxlJobConfig.java

我们直接从xxl-job-executor-sample-springboot项目中把XxlJobConfig.java配置类复制到你的项目中即可,不需要进行任何的修改。

@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@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;}}
修改项目配置文件
# web port
server.port=8098
# no web
#spring.main.web-environment=false# log config
logging.config=classpath:logback.xml### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:9100/xxl-job-admin### xxl-job, access token
xxl.job.accessToken=default_token### xxl-job executor appname
xxl.job.executor.appname=xxkfz-job-fileExport
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
编写测试类

TaskConfig.java

@Component
@Slf4j
public class TaskConfig {@XxlJob("fileExport")public void execute() {log.debug("文件开始导出了......");}
}
任务配置

新增执行器

在这里插入图片描述

配置任务

在这里插入图片描述

测试

点击执行一次查看逻辑是否执行,控制台是否打印日志。

注:若需要项目一致保持运行,选择启动即可。

在这里插入图片描述

运行结果

控制台输出日志

在这里插入图片描述

以上就是Spring Boot集成XXL-JOB的具体详细过程,感谢阅读。

参考资料

[1] XXL-JOB分布式任务调度平台: https://www.xuxueli.com/xxl-job/

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

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

相关文章

阿里云 业务集群的冗余、备份、监控方案

1. 请解释什么是业务集群的冗余、备份和监控&#xff1f; 一、冗余方案 硬件冗余&#xff1a;在业务集群中&#xff0c;关键设备如服务器、存储设备等应采用双机热备或集群技术&#xff0c;确保在某台设备出现故障时&#xff0c;其他设备能够自动接管工作&#xff0c;保证业务…

一、认识微服务

目录 一、单体架构 二、分布式架构 三、微服务 1、微服务架构特征&#xff1a; 1.单一职责&#xff1a; 2.面向服务&#xff1a; 3.自治&#xff1a; 4.隔离性强&#xff1a; 2、微服务结构&#xff1a; 3、微服务技术对比&#xff1a; 一、单体架构 二、分布式架构 三…

thinkphp5 application/json请求取json数据

当http的content-typeapplication/json时 我们在thinkphp5中如何取json数据&#xff1f; 1&#xff0c;参数信息获取 $user $this->request->param(user); 2&#xff0c;json数据获取并转为字符串 $json json_encode($this->request->post()); 3&#xff…

MyBatis Plus整合Redis实现分布式二级缓存

MyBatis缓存描述 MyBatis提供了两种级别的缓存&#xff0c; 分别时一级缓存和二级缓存。一级缓存是SqlSession级别的缓存&#xff0c;只在SqlSession对象内部存储缓存数据&#xff0c;如果SqlSession对象不一样就无法命中缓存&#xff0c;二级缓存是mapper级别的缓存&#xff…

TYUST-RM2023-NewMaker哨兵视觉代码

目录 1 TYUST-RM2023-NewMaker哨兵视觉代码 1.1 说明 1.2 算法设计 1.3 识别思路 TYUST-RM2023-NewMaker哨兵视觉代码 说明 本套代码是太原科技大学NewMaker战队2023赛季哨兵开源代码 本套代码主要含有&#xff1a;TYUST-RM2023赛季哨兵视觉代码&#xff0c;主要模块…

等保到底在“保”什么?

在信息时代&#xff0c;等保评级成为衡量企业信息安全水平的重要标准。那么&#xff0c;什么是等保评级呢&#xff1f;等保合规到底保的是什么呢&#xff1f;一起来看看吧。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 等保评级&#xff0c;会从七个维度进…

DevEco Studio开发工具下载、安装(HarmonyOS开发)_For Mac

一、说明 初学HarmonyOS开发&#xff0c;DevEco Studio开发工具的安装和使用是必须的。 &#xff08;注&#xff1a;不多废话&#xff0c;跟着下面流程操作下载、安装DevEco Studio即可。&#xff09; 二、下载DevEco Studio 1.官网下载地址&#xff1a; https://developer.…

ffmpeg EasyAVFilter去B帧

要设置无B帧的 ffmpeg 命令行&#xff0c;可以使用以下命令&#xff1a; ffmpeg -i input.mp4 -bf 0 output.mp4 其中&#xff0c;-bf 参数表示 B 帧数。将其设置为 0 即可禁用 B 帧。 那么EasyAVFilter里面去B帧就是调用&#xff1a;EasyAVFilter_AddFilter(handle, “-bf 0”…

springboot苍穹外卖实战:十、缓存菜品(手动用redisTemplate实现缓存逻辑)+缓存套餐(Spring cache实现)

缓存菜品 缺点 缓存和数据库的数据一致性通常解决方案&#xff1a;延时双删、异步更新缓存、分布式锁。 该项目对于缓存菜品的处理较为简单&#xff0c;实际可以用管道技术提高redis的操作效率、同时cache自身有注解提供使用。 功能设计与缓存设计 建议这部分去看下原视频&…

华为:每个企业都能“一触即达”数智世界

在大模型浪潮的影响下&#xff0c;几乎各行各业都在探讨数智化转型的课题&#xff0c;一些隐藏在水面下的问题正逐渐浮出水面&#xff1a; 一方面&#xff0c;数智化转型的呼声很高&#xff0c;但很多企业不知道该从何处着手&#xff0c;怎么通过数智化的能力降本增效&#xf…

​软考-高级-系统架构设计师教程(清华第2版)【第8章 系统质量属性与架构评估(P286~319)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第8章 系统质量属性与架构评估&#xff08;P286~319&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

Unity中Shader矩阵的逆矩阵

文章目录 前言一、逆矩阵的表示二、逆矩阵的作用四、逆矩阵的计算五、顺序的重要性六、矩阵的逆总结1、求矩阵的逆前&#xff0c;这个矩阵必须得是个方阵2、只有 A x A ^-1^ A^-1^ x A 1时&#xff0c;A的逆才是A^-1^3、求2x2矩阵的逆&#xff1a;交换 a 和 b 的位置&#xf…

国际腾讯云:云服务器疑似被病毒入侵问题解决方案!!!

云服务器可能由于弱密码、开源组件漏洞的问题被黑客入侵&#xff0c;本文介绍如何判断云服务器是否被病毒入侵&#xff0c;及其解决方法。 问题定位 使用 SSH 方式 或 使用 VNC 方式 登录实例后&#xff0c;通过以下方式进行判断云服务器是否被病毒入侵&#xff1a; rc.loca…

夯实c语言基础

二维数组 在C语言中&#xff0c;定义二维数组时需要指定行和列的大小。在引用中&#xff0c;int a[][3]{1,2,3,4,5,6,7,8}定义了一个二维数组a&#xff0c;其中有两行三列&#xff0c;即a[0]1, a2, a3, a4, a5, a6。而int a[]则是错误的定义方式&#xff0c;因为在定义时必须指…

使用flutter的Scaffold脚手架开发一个最简单的带tabbar的app模板

flutter自带的scaffold脚手架可以说还是挺好用的&#xff0c;集成了appBar&#xff0c;还有左侧抽屉&#xff0c;还有底部tabbar&#xff0c;可以说拿来就可以用了啊&#xff0c;所以我今天也体验了一下&#xff0c;做了一个最简单的demo&#xff0c;就当是学习记录了。 效果展…

JS-项目实战-代码优化-事件动态绑定

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

场景图形管理 - (2)

裁剪平面示例(二) 裁剪平面(osg::Scissor)示例(二)的代码如程序清单8-2所示 // 裁剪平面测试&#xff08;2&#xff09; void scissor_8_2(const string strDataFolder) { osg::ref_ptr<osgViewer::Viewer> viewer new osgViewer::Viewer(); osg::ref_ptr<osg::Gra…

msvcp140.dll丢失的解决办法,msvcp140.dll丢失会导致电脑出现哪些错误

msvcp140.dll丢失的解决办法都有哪些&#xff1f;如果电脑不及时将msvcp140.dll文件进行修复的话电脑可能会出电脑可会出现哪些错误&#xff1f;今天就和大家说说都有哪些解决办法有效的解决msvcp140.dll丢失的问题。 一.缺失msvcp140.dll会有什么问题 当电脑上缺少msvcp140.d…

基于stm32f103系列的简单软件I2C和硬件I2C通讯

这篇文章主要分为三个部分来阐述&#xff0c;分别是I2C的基本知识&#xff0c;软件I2C通讯&#xff0c;硬件I2C通讯。I2C的基本知识这一块&#xff0c;部分讲解以及图表来自b站江科大的up&#xff0c;很感谢这位up&#xff0c;大家可以关注一波。操作实现的时候&#xff0c;up使…