【二】xxl-job 源码分析

news2024/12/23 6:11:59

xxl-job 源码分析

简介:阅读优秀的开源项目源码总是一件让人激动的事情,分布式调度平台xxl-job我们在生产环境也是有了很多的实践应用,一款产品使用久了对其实现原理多少有些了解了,今天也是抽出整块的时间来认真分析一下xxl-job的设计原理,吸收其中源码的精华。

一、源码目录

首先我们到git上面把源码down到本地,导入idea中,如下所示:

根据官网介绍各目录结构内容如下:

  1. - /doc :文档资料
  2. - /db :“调度数据库”建表脚本
  3. - /xxl-job-admin :调度中心,项目源码
  4. - /xxl-job-core :公共Jar依赖
  5. - /xxl-job-executor-samples :执行器,Sample示例项目(大家可以在该项目上进行开发,也可以将现有项目改造生成执行器项目)

二、架构设计

1、设计思想

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

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

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

2、系统组成

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

3、架构图

三、设计原理

下图是xxl-job的执行流程原理图:

  • 任务执行器根据配置的调度中心的地址,自动注册到调度中心。
  • 达到任务触发条件,调度中心下发任务。
  • 执行器基于线程池执行任务,并把执行结果放入内存队列中、把执行日志写入日志文件中。
  • 执行器的回调线程消费内存队列中的执行结果,主动上报给调度中心。
  • 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情。

上面这段描述的是xxl-job整体的执行流程,接下来我将基于源码分析的方式来讲解一下调度中心和执行器的设计原理

1、调度中心

1.1、任务的执行或触发

任务执行方式

  1. 根据配置的cron表达式周期性执行任务
  2. 主动触发一次任务

1.2、主动触发一次任务

        在xxl-job控制台界面中,点击【立即执行】,会触发一次任务,后台会调用JobTriggerPoolHelper.trigger() 任务。该方法是将任务提交给一个线程池,在线程池中调用XxlJobTrigger.trigger方法。

阅读源码可以得出如下执行流程:

  1. admin 通过触发执行一次,会调用JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam);
  2. 调用helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam); 将这个任务加入到jobTriggerPool池里面,提交到线程池里执行
  3. 向线程池提交任务里调用了 XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam)方法;

  4. 之后调用了processTrigger(group, jobInfo, finalFailRetryCount, triggerType, shardingParam[0], shardingParam[1]);

  5. 然后通过创建的路由策略,选择同名执行器的某个执行器执行

  6. 然后调用 triggerResult = runExecutor(triggerParam, address);

  7. runResult = executorBiz.run(triggerParam);

  8. 获取jobThread和JobHandler处理器,然后将任务键入的jobThread的队列中

以上是主动触发一次任务的整体处理流程了。

2、执行器

        执行器相当于一个应用服务,需要注册到调度中心统一管理。执行器主要功能是把自己注册到调度中心然后保存在数据库(xxl_job_registry表),并定时发送心跳,保持续约。执行器正常关闭,也主动告知调度中心注销,这种是主动注册。

        如果执行器网络故障,调度中心就不知道执行器的情况,如果把任务路由给一个不可用的执行器,就会导致任务失败。调度中心会启动一个后台线程定时调用执行器接口,如果发现异常就下线。

        这里我们首先关注一下XxlJobConfig核心配置类,在这里我们这里将 com.xxl.job.core.executor.impl.XxlJobSpringExecutor 交由容器托管了。

          XxlJobSpringExecutor实现了ApplicationContextAware, SmartInitializingSingleton, DisposableBean接口。SmartInitializingSingleton 接口的 afterSingletonsInstantiated()方法类似bean实例化执行后的回调函数。afterSingletonsInstantiated 会在spring 容器基本启动完成后执行。此时所有的单列bean都已初始化完成。实现了SmartInitializingSingleton 接口的类
可以在afterSingletonsInstantiated 中做一些回调操作。      

         在afterSingletonsInstantiated()方法中调用了父类的start()方法。然后再start()方法中我们看到了如下启动方法:

        在XxlJobExecutor的initEmbedServer 方法中创建了内置容器,EmbedServer的start方法又会启动容器,并且会开始注册执行器。

EmbedServer 中和注册相关的部分代码:

        ExecutorRegistryThread 是一个执行器注册线程类。到这里我们对执行器的整体注册过程进行了一次梳理,细节部分大家可以自行去深入研究学习。

总结

        本文主要是梳理了一下自己理解xxl-job的思路,中间一段内容摘抄自官网(本部分都是通用的没必要自己去重复),文章整体并不是为了详细讲解清楚xxl-job开源项目,而是提取了核心关注点来进行的介绍,目的是让大家能够对xxl-job主流程和设计思路有个清晰的认识。

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

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

相关文章

RFID技术:钢条加工现场的智能化管理利器

RFID技术:钢条加工现场的智能化管理利器 RFID(Radio Frequency Identification)技术作为一种非接触式自动识别技术,近年来在工业领域得到广泛应用。本文将探讨RFID在钢条加工现场的应用,包括材料追踪与管理、生产过程…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果: 输入:nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3],一共有2个 利用枚举法: 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

Redis高可用之持久化、主从复制(附配置实例)

目录 一、Redis高可用1.1 简介1.2 高可用策略 二、Redis 持久化2.1 简介2.2 redis 的 2 种持久化方式2.2.1 RDB持久化2.2.2 AOF持久化 三、Redis主从复制3.1 什么是主从复制?3.2 为什么要用主从复制?3.3 主从复制的特性3.4 主从复制工作原理3.4.1 全量复…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

TextSniper for Mac: 革新您的文本识别体验

你是否曾经需要从图片或扫描文档中提取文本,却苦于没有合适的工具?那么,TextSniper for Mac将是你的完美解决方案。这款文本识别工具将彻底改变你处理图像和扫描文件的方式,让你更快速、更高效地完成任务。 TextSniper for Mac 是…

直流负载箱的使用场景和应用范围是什么?

直流负载箱是用于模拟电子设备负载的测试仪器,用于电源供应器、逆变器、电池等直流电源设备的性能测试和负载仿真,它可以模拟各种负载条件,以便测试和评估电源设备在不同负载情况下的工作性能,直流负载箱的使用场景和应用范围广泛…

Jmeter状态码及请求

Jmeter与LR的区别? 1.都是压测工具,可以用来做性能测试,但是Jmeter比较轻量级。jmeter 是用java语言写的,需要java环境,LR不需要,除非用iavavuser协议 (不用掌握) 2.Jmeter更偏向于功能和技术,LR偏向于业务…

VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001

VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001 由于第12代英特尔酷睿处理器的16核/24线程配置,Nuvo-9000型号与之前的平台相比,性能大幅提升。它们还支持新的DDR5内存标准,以获得更多内存带宽&#xf…

气传导耳机有哪些品牌?性能不错的气传导耳机分享

​气传导耳机采用空气传导技术,使声音传递更加自然舒适。随着气传导耳机的创新发展,越来越多用户不知道气传导耳机该怎么选了,所以今天我来推荐几款相当不错的气传导耳机给大家参考,享受音乐时不受耳道压力的困扰。 一、NANK南卡…

电力智能化运维平台:提高效率和保障电力系统的稳定运行

随着信息技术、人工智能、物联网的发展,电力系统的规模和复杂性也在不断增长。为了确保电力系统的稳定运行,传统的运维方式已经无法满足需求。电力智能化运维平台应运而生,为电力行业带来了全新的运维模式和技术手段。 电力智能化运维平台…

密歇根大学发布3款生成式AI产品,并应用在教学、日常工作!

密歇根日报消息,美国顶级公立大学-密歇根大学宣布推出3款生成式AI产品UM-GPT、UM-GPT开发包和UM-Maizey,并将其应用在教学、日常工作、学术研究等领域。微软也参与了此次产品研发,并提供技术支持。 密歇根大学将为安娜堡分校、弗林特分校、迪…

重学C++ | std::set 的原理

std::set 是C标准库中的容器之一&#xff0c;它基于红黑树实现。std::set 利用红黑树的特性来实现有序的插入、查找和删除操作&#xff0c;并且具有较好的平均和最坏情况下的时间复杂度。 当向 std::set 插入元素时&#xff0c;它会按照特定的比较函数&#xff08;bool less<…

优化您的Mac系统,提升性能——TinkerTool System for Mac

TinkerTool System for Mac 是一款功能强大的系统维护工具&#xff0c;为您提供了一系列优化和排错工具&#xff0c;帮助您轻松管理和提升Mac系统的性能。不论您是普通用户还是高级用户&#xff0c;这款应用程序都能满足您的需求&#xff0c;让您的Mac保持高效稳定。 TinkerTo…

java项目之人事管理系统(ssm源码+文档)

项目简介 人事管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、员工管理、部门经理管理、部门信息管理、员工考勤管理、签到管理、请假申请管理、工资查询管理、部门类型管理.部门经理&#xff1a;个人中心、员工管理、部门信息管理、员工考勤管理、签到管理…

【rhce考试时间是每年什么时候呢?】

RHCE9.0 新技术 公开课 10月11日&#xff0c;12日 感兴趣可留言 如果你是一个系统管理员&#xff0c;或者正朝着这个方向努力前进&#xff0c;那么你可能已经听过RHCE这个词。RHCE是Red Hat Certified Engineer的缩写&#xff0c;是全球公认的Linux系统工程师认证之一。通过获…

[C++随笔录] list模拟实现

list模拟实现 基本结构(1)iterator类的基本结构(2)Node类的基本结构(3)list类的基本结构 初始化(1) list类的构造函数(2) Node类的构造函数(3) iterator类中的构造函数 迭代器行为(1) 前置&& 后置(2) 前置-- && 后置--(3)operator* && operator->(4…

微机原理与接口技术

8088/8086 CPU的两种工作模式 8088/8086可工作于两种模式下&#xff1a;最小模式与最大模式 ■最小模式为单处理器模式&#xff0c;所有控制信号由微处理器产生 ■最大模式为多处理器模式&#xff0c;部分控制信号由外部总线控制器 产生 ■用于包含协处…

阿里云服务器共享型和企业级性能差异对比

阿里云ECS云服务器共享型和企业级有什么区别&#xff1f;企业级就是独享型&#xff0c;共享型和企业级云的主要区别CPU调度模式&#xff0c;共享型是非绑定CPU调度模式&#xff0c;企业级是固定CPU调度模式&#xff0c;共享型云服务器在高负载时计算性能可能出现波动不稳定&…

Pytorch之GoogLeNet图像分类

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 目录 前言 一、GoogLeNet网络结构 1.Inception 结构 (1)Inception v1 (2)…

基于FPGA的图像形态学膨胀算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 在FPGA中仿真结果如下所示&#xff1a; 将FPGA中的仿真结果导入到matlab显示二维图&#xff0c;效果如下&#xff1a; 2.算法运行软件版本 matla…