轻量级分布式定时任务框架XXL-Job

article/2025/10/10 2:21:49

轻量级分布式定时任务框架XXL-Job:
XXL-JOB是一款轻量级的分布式定时任务框架,上手简单,操作容易,XXL-Job可以到官网下载也可以去gitee上拉取源码,其中核心模块分页两个:1:是分布式调度服务, 2:是执行器。启动分布式调度服务模块,可以直接登录后台系统。

首先简单了解一下XXL-JOB的XXL-JOB的有点特性:

1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; ​
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效; ​
3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA; ​
4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA; ​ 5、注册中心: 执行器会周期性自动注册任务,
调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; ​
6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; ​
7、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;

8、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
​ 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; ​
10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务; ​
11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试; ​
12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式; ​
13、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;

14、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。

15、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发

我将XXL-Job整合到Springboot,赋gitee项目源码练习,注意导入doc文件下的数据库,数据库版本在mysql8.0即可https://gitee.com/xzq25_com/xxl-job
.

了解XXL-JOB执行原理图:详细的架构图在gitee源码doc目录下有
在这里插入图片描述
.
.
项目拉取之后,可以看到项目模块:xxl-job-admin模块是整合框架源码中的调度服务模块
另外xxl-job-test是个人自定义的业务模块,也叫执行器模块,
启动顺序:先启动admin服务,在启动test服务

在这里插入图片描述
项目启动之后,http://localhost:8080/xxl-job-admin 进入登录页 ,默认用户:admin 密码:123456
.

进入到登录首页:
在这里插入图片描述

进入之后,可以看到首页
在这里插入图片描述

接下来就是熟悉一下调度系统具体使用啦:
系统的具体分为报表、日志、执行器管理、任务管理、用户管理。
在这里插入图片描述

实际工作中,先得创建一个执行器如下图所示:
在这里插入图片描述

创建完执行器,接下来就是在任务管理处创建调度任务,关联执行器,如下图所示:
在这里插入图片描述
这里需要了解一下上图得调度类型、运行模式、路由策略
1,调度类型分为3种
在这里插入图片描述
基本实际工作种选择第二种Cron采用时间表达式来定时触发
.

2,运行模式:
在这里插入图片描述

运行模式:xxl-job中,不仅支持运行预先编写好的任务类,还可以直接输入代码或脚本运行
BEAN模式需要指定任务类,通常是Spring中的Bean,这个任务叫做JobHandler,是在执行器端编写的
GLUE模式运行代码或脚本,支持Java脚本、Shell脚本、Python脚本、PHP脚本、Node.js脚本等,代码是直接维护在调度器的

对于GLUE模式,主要是在调度端直接输入需要执行得脚本,执行一些与业务代码无直接关系的信息。
基本上工作当中是BEAN模式运行,执行器的执行业务代码维护在项目服务器上,这里就简单了解下GLUE模式下脚本运行即可

在这里插入图片描述
在这里插入图片描述

.

3.路由策略:
路由策略种类:
在这里插入图片描述

1.第一个:当选择该策略时,会选择执行器注册地址的第一台机器执行,如果第一台机器出现故障,则调度任务失败。

2.最后一个:当选择该策略时,会选择执行器注册地址的最后一台机器执行,如果最后一台机器出现故障,则调度任务失败。

3.轮询:当选择该策略时,会按照执行器注册地址轮询分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移。

4.随机:当选择该策略时,会按照执行器注册地址随机分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移。

5.一致性HASH:当选择该策略时,每个任务按照Hash算法固定选择某一台机器。如果那台机器出现故障,调度任务失败,任务不会转移。

6.最不经常使用:当选择该策略时,会优先选择使用频率最低的那台机器,如果其中一台机器出现故障,调度任务失败,任务不会转移。

7.最近最久未使用:当选择该策略时,会优先选择最久未使用的机器,如果其中一台机器出现故障,调度任务失败,任务不会转移。

8.故障转移:当选择该策略时,按照顺序依次进行心跳检测,如果其中一台机器出现故障,则会转移到下一个执行器,若心跳检测成功,会选定为目标执行器并发起调度。

9.忙碌转移:当选择该策略时,按照顺序依次进行空闲检测,如果其中一台机器出现故障,则会转移到下一个执行器,若空闲检测成功,会选定为目标执行器并发起调度。

10.分片广播:当选择该策略时,广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务。如果其中一台机器出现故障,则该执行器执行失败,不会影响其他执行器。
.
.
其他路由策略是比较好理解得,这里主要讲一下分片广播策略:

例如:现在有这么一个场景:一共5太机器集群,需要分布式定时任务执行同一段代码去查询mysql分表数据,这里分表在代码层面上模拟,利用调度系统分配给机器的分片id,将id经过hash运算之后再将业务数据存入mysql,主键id是分片id+生成业务id得组合。这种场景下,采用分片广播模式,只有当前分片id匹配符合,调度任务才可以业务代码,可以定时任务执行各自不同数据范围得,而不用每次到mysql查询都是全盘扫描。
.
分片广播策略下,有两个很重要的数据分片总数和当前分片数
分片总数:任务集群中任务服务的数量(可以理解执行器绑定了多少个ip:port)
当前分片数:当前的下标,同一片任务机器中,这个数字都是一样。

广播分片提供demo
博客地址:https://blog.csdn.net/weixin_44507274/article/details/105462365

    /*** 分片广播任务*/@XxlJob("shardingJobHandler")public ReturnT<String> shardingJobHandler(String param) throws Exception {log.info("参数:" + param);// 分片参数ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());log.info("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());// 业务逻辑for (int i = 0; i < shardingVO.getTotal(); i++) {if (i == shardingVO.getIndex()) {XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);log.info("第 {} 片, 命中分片开始处理", i);} else {XxlJobLogger.log("第 {} 片, 忽略", i);log.info("第 {} 片, 忽略", i);}}return ReturnT.SUCCESS;}

我这个发布了两个这样的服务,并且开启定时任务3s执行一次
在这里插入图片描述
在这里插入图片描述
然调度中心每次调度任务都会响应到所有的定时任务上,只是不同的服务命中的分片不一样。分片的值是调度中心分配的。

停了一个服务会怎么样?

在这里插入图片描述
如果两个停一个,分片总数会发生变化,并且当前分片数也可能会发生变化。
.

下面是gittee项目源码启动服务:
启动两个服务:一个调度,一个执行器
在这里插入图片描述
需要定时执行的一段业务代码:

@Component
public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);private static  Integer i=0;/*** 1、简单任务示例(Bean模式)*/@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {System.out.println("执行任务第 【"+(++i)+"】 次....");}
}

截图如下:
在这里插入图片描述

调度系统里:启动定时任务
在这里插入图片描述

运行结果如下:
在这里插入图片描述

至此,XXL-JOB的基本了解和应用到此结束啦,希望能帮助到你哦…


http://chatgpt.dhexx.cn/article/0wbhNtVS.shtml

相关文章

Springboot结合Redis实现分布式定时任务

一、背景 之前分享过分布式定时任务的技术选型方案&#xff1a;分布式定时任务技术选型方案&#xff0c;个人青睐xxl_job&#xff0c;分享了搭建接入流程&#xff1a;xxl_job搭建方案&#xff0c;本次项目需求较为简单&#xff0c;同时时间紧张。下面介绍利用Redis锁实现分布式…

分布式定时任务框架说明

分布式定时任务框架说明 分布式定时任务框架说明Quartz概念架构组件springboot集成方式使用内存使用数据库 TBSchedule&#xff1a;elastic-job概念架构组件执行流程特性 satumxxl-job概念特性架构组件使用 分布式定时任务框架说明 Quartz 概念 Quartz&#xff1a;Java事实上…

分布式定时任务对比

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job , xxl-job &#xff0c;quartz , saturn, opencron , antares el…

简单粗暴的分布式定时任务解决方案

分布式定时任务 1.为什么需要定时任务&#xff1f;2.数据库实现分布式定时任务3.基于redis实现 1.为什么需要定时任务&#xff1f; 因为有时候我们需要定时的执行一些操作&#xff0c;比如业务中产生的一些临时文件&#xff0c;临时文件不能立即删除&#xff0c;因为不清楚用户…

Java 实现分布式定时任务

文章目录 前言一、技术点二、代码实践1、引入库2、创建启动线程入口3、表结构4、任务解析5、任务拉取 三、结果展示四、总结 前言 最近有一个需求&#xff1a;需要实现分布式定时任务。而市面上的定时任务大多数都是基于Scheduled注解进行实现。不符合需求。所以根据需求整体思…

分布式定时任务调度

前言 什么是分布式定时任务? 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 为什么要采用分布式定时任务&#xff1f; 单点定时任务的缺点: 功能相对简单&#xff0c…

分布式定时任务-XXL-JOB-教程+实战

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行&#xff0c;或者周期性的去执行某个任务&#xff0c;比如&#xff1a;每天晚上24点做数据汇总&#xff0c;定时发送短信等。 1.2.常见定时任务方案…

几种常用的分布式定时任务

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job quartz saturn opencron antares elastic-job el…

分布式定时任务

分布式定时任务 1&#xff0c;什么是分布式定时任务&#xff1b;2&#xff0c;为什么要采用分布式定时任务&#xff1b;3&#xff0c;怎么样设计实现一个分布式定时任务&#xff1b;4&#xff0c;当前比较流行的分布式定时任务框架&#xff1b; 1&#xff0c;什么是分布式定时…

python类型转换函数str

str函数&#xff0c;将数字转为字符串&#xff1a;

Python 类型转换(数据类型转换函数大全)

文章目录 虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。 比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点…

python怎么转换文件格式_python怎么转换数据类型

在处理数据的时候&#xff0c;经常需要转换数据的格式&#xff0c;来方便数据遍历等操作。下面我们来看一下Python中的几种数据类型转换。 1、字符串转字典&#xff1a;dict_string "{name:linux,age:18}" to_dict eval(dict_string) print(type(to_dict)) 也可以用…

python强制类型转换

1.强转为int string->int a string print(int(a))a 1.2 print(int(a))a 12 print(int(a))string仅在无特殊字符&#xff08;包括小数点&#xff09;且全为数字的情况下可强转为float boolen->int a True b False print(int(a)) print(int(b))float->int a …

python批量转换数据类型_python中数据类型转换

1、list转str 假设有一个名为test_list的list,转换后的str名为test_str 则转换方法: test_str = "".join(test_list) 例子: 需要注意的是该方法需要list中的元素为字符型,若是整型,则需要先转换为字符型后再转为str类型。 2、str转list 假设有一个名为test_str的…

python类型转换

一、int——支持转换为 int 类型的&#xff0c;仅有 float、str、bytes&#xff0c;其他类型均不支持。 1、str与bytes类型是什么&#xff0c;有什么区别 文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。 字符串是 以字符为单位进行处理…

浅谈Python中的类型转换

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;四种常见转换类型 1. int()函数 &#xff08;1&#xff09;int()函数的格式 &#xff08;2&#xff09;示例 2. float()函数 &#xff08;1&#xff09;float()函数格式&#xff1a; &#xff08;2&…

初学ansys:模态分析及谐响应分析

谐响应为线性系统对简谐激励的稳态响应&#xff0c;当系统含有阻尼或者激励为复数&#xff08;相位不为0或pi&#xff09;,谐响应为复数。 ansys可在模态分析的基础上进行谐响应分析&#xff1a; 2阶频率377.47&#xff0c;振型如下&#xff1a; 当z向加速度10g,右端平面z向位…

关于模态分析

模态分析目的是获得固有频率、模态振型、振型参与系数、有效质量 模态分析是动力学的基础分析,谐响应分析的前提是进行模态分析。 什么是固有频率呢&#xff1f;共振频率呢&#xff1f; 比如一个单摆做好后&#xff0c;他的振动频率等于2Pi&#xff08;l/g&#xff09;^&#x…

Ansys-模态分析基础上的谱分析学习收获

谱分析是一种将模态分析和已知谱联系起来的、计算结构位移和应力的分析方法&#xff0c;主要用于确定结构对随机载荷或时间变化载荷&#xff08;如地震载荷&#xff09;的动力响应。谱是谱值和频率的关系曲线&#xff0c;它反映了时间历程载荷的强度和频率之间的关系。响应谱&a…