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

xxl-job 源码梳理(2)-服务端

目录

  • 1. 控制面的接口
  • 2.手动触发任务
  • 2. 定时任务的实现

1. 控制面的接口

服务端包含xxl-job的管理端,页面上的接口后端一系列的controller接口

在这里插入图片描述

在这里插入图片描述

appName是一个核心概念,它是指执行器应用的名称,appName是执行器的唯一标识

页面上的接口,对应这这里一系列的controller
在这里插入图片描述

2.手动触发任务

触发任务的接口为 /jobinfo/trigger
com.xxl.job.admin.controller.JobInfoController#triggerJob

在这里插入图片描述

触发任务执行的具体实现在 JobTriggerPoolHelper ,其中创建了一个快触发线程池 fastTriggerPool 和一个慢触发线程池 slowTriggerPool ,用于隔离较慢的响应节点。

在这里插入图片描述

在触发具体任务时,根据jobId判断,若触发该jobId的耗时在1分钟内有10次超过500ms,则该jobId使用 慢线程池执行,否则使用快线程池

在这里插入图片描述

触发任务的关键方法为:com.xxl.job.admin.core.trigger.XxlJobTrigger#trigger

在这里插入图片描述

在这里插入图片描述

分片指的是任务分片广播执行的概念,当调度中心调度一个设置了分片参数的任务时,任务会被拆分成多个子任务(分片),每个分片会被分配一个唯一的序号(分片参数,通常从0开始)。
分片任务的处理主要还是在客户端,可参考如下示例
在这里插入图片描述

触发任务实际上就是发起一个http请求,但前中后会记录任务的执行结果、日志等信息,参考方法:com.xxl.job.admin.core.trigger.XxlJobTrigger#processTrigger

大体的步骤分为:

  1. 保存信息至log表
  2. 初始化TriggerParam数据
  3. 初始化客户端的ip地址(从grop中获取)
  4. 发起http调用(参考:com.xxl.job.core.biz.client.ExecutorBizClient#run
  5. 收集任务触发信息
  6. 将触发信息保存至log表中

2. 定时任务的实现

xxl-job中的定时任务是通过Cron表达式实现的,其具体的实现可参考 : com.xxl.job.admin.core.thread.JobScheduleHelper

对于定时任务的执行,其实现思路是:

  1. 线程异步轮询,计算job的下一次执行时间
  2. 线程异步轮询,计算当前时间窗口内需要执行的任务,并触发任务执行

根据Cron表达式计算任务的下一次执行时间: com.xxl.job.admin.core.thread.JobScheduleHelper#generateNextValidTime

在这里插入图片描述

JobScheduleHelper 维护了两个线程 scheduleThreadringThread ,两者分工不同:

大体来讲,scheduleThread是负责触发任务调度的线程,周期性地检查所有的任务计划(Cron表达式定义的任务),如果发现有任务到达执行时间,则将这些即将执行的任务放入到一个“时间轮”(ringData 字段,是是一个map结构),ringThread会遍历时间轮,检查每个槽位上是否有任务需要执行,一旦发现,就立即进行处理(即发起调度)

但实际上,scheduleThread的处理有很多细节:

  1. scheduleThread 周期性从数据库中查询任务,查询之前,会基于数据库xxl_job_lock表实现全局锁
  2. 批量获取任务信息后,会便利判断当前job的下一次执行时间
    1. 若待执行任务时间早于(过期了)当前时间,且大于5秒,则进行MISFIRE触发
    2. 若待执行任务时间早于当前时间不超过5秒(过期了,但在窗口内),则进行CRON触发

      由于scheduleThread周期性执行,为了处理周期间需要执行的任务,此处会判断,所触发任务后,下一次的待执行时间于当前时间相差不超过5秒,也会添加到时间轮中

    3. 若待执行时间晚于当前时间(还不需要执行),则将当前任务添加到时间轮中
  3. 更新数据库中的job信息(trigger_last_timetrigger_next_timetrigger_status
  4. 释放全局锁
  5. 若总耗时小于1000ms,则线程sleep一段时间

相关文章:

xxl-job 源码梳理(2)-服务端

目录 1. 控制面的接口2.手动触发任务2. 定时任务的实现 1. 控制面的接口 服务端包含xxl-job的管理端,页面上的接口后端一系列的controller接口 appName是一个核心概念,它是指执行器应用的名称,appName是执行器的唯一标识 页面上的接口&#…...

C++ GDl+ 多张图片合并生成GIF动画格式图片

使用ImageMagick多张图合成GIF。 1、工具下载安装 下载地址:ImageMagick – Download,windows下载版本如下: 下载后,安装,安装时选择为C/C安装动态库和头文件。 2、代码实现 附加包含目录:ImageMagick-7.…...

【C++】模拟实现list

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目及其功能 📌了解list官方标准 了解模拟实现list 📌了解更底层的list实现 二.list迭代器和vector迭代器的异同 📌迭…...

怎么使用git merge合并两个分支?

在Git中,git merge命令用于将两个或多个开发历史(通常指分支)合并到一起。以下是一个基本的步骤指南,说明如何使用git merge来合并两个分支。 ### 前提条件 - 确保你已经安装了Git,并且熟悉基本的Git命令,如…...

ios 5.5寸、ipad13英寸如何截屏

ios上架的时候,你可能会发现,上架需要ios 5.5寸,ipad需要13英寸的屏幕截屏。 但是尴尬了,我们手头上的手机,可能是最新的iphone 15,并没有远古时代iphone 8 plus的5.5寸,那么我们该如何截屏呢&…...

spdlog日志库--输出格式(fmt 库集成)

系列目录 spdlog日志库–基础介绍 spdlog日志库–源码解析 文章目录 1. 格式输出fmt格式输出2. format_spec 格式空间正数和负数的格式#号控制输出格式3. %s占位符 切换 {}占位符 (fmtlib(fmt::format)){}占位符 -> %s等占位符%s占位符 -> {}占位符4. 不使用占位符({}、%…...

Docker简介 MacM1安装Docker

文章目录 1 Docker简介2 Docker VS 虚拟机1 Docker优势2 Docker用途 3 MacM1 下载安装Docker1 配置环境变量 4 配置Docker2 设置Docker资源3 设置Docker镜像 参考 1 Docker简介 Docker主要解决了软件开发和运行配置的问题,但是由于其功能的强大,也被应用…...

【Linux】yum软件包管理器(使用、生态、yum源切换)

目录 1.yum-软件包管理器😸1.1yum使用方法1.2什么是yum?😸1.3yum的周边生态1.4yum源切换1.4.1 查看系统本身yum源1.4.2 软件源1.4.3yum源配置 1.yum-软件包管理器 以下操作需要联网的情况下进行 😸1.1yum使用方法 安装软件时由于需…...

群晖NAS安装Video Station结合内网穿透实现远程访问本地存储的影音文件

文章目录 前言1.使用环境要求:2.下载群晖video station:3.公网访问本地群晖video station:4.公网条件下访问本地群晖video station5.公网条件下使用移动端(安卓,ios等系统)访问本地群晖video station 前言 …...

Vue中@click.stop与@click.prevent

Vue中click.stop与click.prevent 一、click.stop 问题&#xff1a;父元素中添加了一个click事件&#xff0c;其下面的子元素中也添加了click事件&#xff0c;此时&#xff0c;我想点击子元素获取子元素的点击事件&#xff0c;但却触发的是父元素的事件&#xff1a; <view …...

沐风老师3DMax对象随机颜色插件使用方法

3DMax对象随机颜色插件使用教程 3DMax对象颜色插件,是一个功能强大的脚本,它通过提供高级工具来操纵场景中的对象颜色、材质和实例,从而增强了3D设计师和艺术家的工作流程。这个多功能脚本提供了一系列功能,旨在简化对象、组和实例的着色过程。 3DMAX对象颜色插件主要具有…...

安卓将子模块打aar包,并将其远程依赖打包进去

生成 AAR 包 在Android Studio Terminal 窗口输入以下命令&#xff1a; ./gradlew :monitor:assembleRelease把 monitor 换成你子模块的名称&#xff0c;不出意外的话 就会在下面目录生成相应aar文件 注意&#xff1a;如果你的Java运行环境是Java 8 则在老一点的AS上 可以运…...

python 提取视频中的音频 采用ffmpeg-python 库

要使用 ffmpeg-python 库从视频文件中提取音频&#xff0c;首先需要确保你的系统中已经安装了 FFmpeg 和 ffmpeg-python 库。以下是详细的步骤&#xff1a; 步骤 1: 安装 FFmpeg 确保你的系统中已经安装了 FFmpeg。如果你使用的是 CentOS&#xff0c;可以参照前面的回答来安装 …...

区块链的搭建和运维4

区块链的搭建和运维4 (1) 搭建基于MySQL分布式存储的区块链 1.构建单群组网络节点 使用开发部署工具构建单群组网络节点&#xff0c;命令如下&#xff1a; bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,85452. 启动 MySQL 并设置账户密码 输入如下命令&#xff0c;…...

数据驱动决策:内容数据产品经理的成长与价值

数据驱动决策&#xff1a;内容数据产品经理的成长与价值 内容数据产品经理以数据为媒介&#xff0c;在用户与决策之间搭建桥梁&#xff0c;通过理解分析模型和用户决策路径&#xff0c;设计产品以促成更多决策产出&#xff0c;创造用户价值。例如&#xff0c;在衡量数据产品经理…...

pyinstaller 打包python 提示 object has no attribute

参考&#xff1a; 错误&#xff1a;gi.repository.BlockDev’ object has no attribute plugin_specs_from_names 查看包路径 rpm -ql python3-blockdev/usr/lib64/python3.7/site-packages/gi/overrides/BlockDev.py /usr/lib64/python3.7/site-packages/gi/overrides/__pyca…...

ubuntu20.04搭建RUST开发环境并与C语言交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ubuntu20.04搭建RUST开发环境并与C语言交互 前言开战一、确认环境版本二、环境搭建三、hello world&#xff01;四、跟c语言进行交互1.rust调用C静态库2.C调用rust库 总结参考…...

C语言 ——— 学习、使用memmove函数 并模拟实现

目录 memmvoe函数的功能 学习memmove函数​编辑 模拟实现memmove函数 memmvoe函数的功能 memmvoe函数的功能类似于memcpy函数&#xff0c;都是内存拷贝&#xff0c;唯一的区别是memcpy函数不能成功拷贝原数据&#xff0c;而memmvoe函数可以 举例来说&#xff1a; [1, 2, 3…...

职场中必须明白的三个道理,不明白无出头之日,你越早知道越好

职场中有很多优秀的人才&#xff0c;他们工作能力出众&#xff0c;为人处事也非常的善良&#xff0c;但是有时候&#xff0c;这样的优点反而成了他们在职场中被欺负的原因&#xff0c;因为他们太善良&#xff0c;很容易被别人利用&#xff0c;为了自己的利益&#xff0c;有些人…...

做webserver项目的一些问题和思路总结

1.webserver是做什么的&#xff1f;这个项目最后想实现什么&#xff1f; 网络服务器&#xff0c;是一个处理HTTP请求并返回HTTP响应的程序。&#xff08;socket实现的是网络编程&#xff0c;不一定是HTTP&#xff0c;还有其他协议&#xff0c;具体协议由端口来确定&#xff09…...

ArcGIS Pro实战:5分钟搞定气象站点TXT坐标转面状Shapefile(附Python脚本)

ArcGIS Pro气象数据处理实战&#xff1a;从TXT坐标到面状Shapefile的高效转换 在地理信息系统(GIS)工作中&#xff0c;气象站点数据的处理是常见但容易出错的环节。许多气象数据以TXT格式存储&#xff0c;包含站点坐标和边界信息&#xff0c;而将这些数据转换为GIS可用的面状Sh…...

隐式神经表示在计算机视觉中的5个关键应用:图像超分辨率到3D场景重建

隐式神经表示在计算机视觉中的5个关键应用&#xff1a;图像超分辨率到3D场景重建 【免费下载链接】awesome-implicit-representations A curated list of resources on implicit neural representations. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-implicit-repr…...

突破二维限制:开源工具ImageToSTL实现图片转3D模型全攻略

突破二维限制&#xff1a;开源工具ImageToSTL实现图片转3D模型全攻略 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left sid…...

PHP 8.9扩展安全配置黄金标准:NIST SP 800-123兼容性验证 + OWASP ASVS 4.0 Level 2达标清单(仅限企业级用户内部流通)

第一章&#xff1a;PHP 8.9扩展安全加固配置的合规性定位与适用边界PHP 8.9&#xff08;当前为前瞻预研版本&#xff0c;尚未正式发布&#xff09;并非官方已发布的稳定版&#xff0c;但其扩展安全加固配置的设计目标明确指向GDPR、ISO/IEC 27001及OWASP ASVS 4.0.3中关于运行时…...

大语言模型长输入性能研究

研究大语言模型的特性&#xff1a;Maxime Meyer访谈录 在本系列访谈中&#xff0c;我们与AAAI/SIGAI博士联盟的部分参与者进行了交流&#xff0c;以深入了解他们的研究。我们与Maxime Meyer坐下来聊了聊他当前的研究、未来计划以及博士联盟的经历。 能否先介绍一下你自己、你在…...

【Ubuntu】使用网线直连实现双机局域网通信的详细配置指南

1. 为什么需要双机直连&#xff1f; 很多朋友第一次接触双机直连时都会有疑问&#xff1a;现在WiFi这么方便&#xff0c;为什么还要用网线连接两台电脑&#xff1f;其实这种连接方式在特定场景下优势非常明显。我去年帮朋友搭建本地开发环境时就深有体会&#xff0c;当时需要频…...

如何在Windows上获得完整的AirPods体验?终极解决方案来了!

如何在Windows上获得完整的AirPods体验&#xff1f;终极解决方案来了&#xff01; 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop …...

如何实现微信聊天记录的永久保存与智能分析

如何实现微信聊天记录的永久保存与智能分析 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 在数字时代&…...

video-subtitle-extractor:智能去重技术重构硬字幕提取精度

video-subtitle-extractor&#xff1a;智能去重技术重构硬字幕提取精度 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字…...

3分钟搞定Axure中文界面:免费汉化终极指南

3分钟搞定Axure中文界面&#xff1a;免费汉化终极指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面…...