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
大体的步骤分为:
- 保存信息至log表
- 初始化TriggerParam数据
- 初始化客户端的ip地址(从grop中获取)
- 发起http调用(参考:
com.xxl.job.core.biz.client.ExecutorBizClient#run) - 收集任务触发信息
- 将触发信息保存至log表中
2. 定时任务的实现
xxl-job中的定时任务是通过Cron表达式实现的,其具体的实现可参考 : com.xxl.job.admin.core.thread.JobScheduleHelper
对于定时任务的执行,其实现思路是:
- 线程异步轮询,计算job的下一次执行时间
- 线程异步轮询,计算当前时间窗口内需要执行的任务,并触发任务执行
根据Cron表达式计算任务的下一次执行时间: com.xxl.job.admin.core.thread.JobScheduleHelper#generateNextValidTime

在 JobScheduleHelper 维护了两个线程 scheduleThread 和 ringThread ,两者分工不同:
大体来讲,scheduleThread是负责触发任务调度的线程,周期性地检查所有的任务计划(Cron表达式定义的任务),如果发现有任务到达执行时间,则将这些即将执行的任务放入到一个“时间轮”(ringData 字段,是是一个map结构),ringThread会遍历时间轮,检查每个槽位上是否有任务需要执行,一旦发现,就立即进行处理(即发起调度)
但实际上,scheduleThread的处理有很多细节:
scheduleThread周期性从数据库中查询任务,查询之前,会基于数据库xxl_job_lock表实现全局锁- 批量获取任务信息后,会便利判断当前job的下一次执行时间
- 若待执行任务时间早于(过期了)当前时间,且大于5秒,则进行MISFIRE触发
- 若待执行任务时间早于当前时间不超过5秒(过期了,但在窗口内),则进行CRON触发
由于scheduleThread周期性执行,为了处理周期间需要执行的任务,此处会判断,所触发任务后,下一次的待执行时间于当前时间相差不超过5秒,也会添加到时间轮中
- 若待执行时间晚于当前时间(还不需要执行),则将当前任务添加到时间轮中
- 更新数据库中的job信息(
trigger_last_time、trigger_next_time、trigger_status) - 释放全局锁
- 若总耗时小于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 问题:父元素中添加了一个click事件,其下面的子元素中也添加了click事件,此时,我想点击子元素获取子元素的点击事件,但却触发的是父元素的事件: <view …...
沐风老师3DMax对象随机颜色插件使用方法
3DMax对象随机颜色插件使用教程 3DMax对象颜色插件,是一个功能强大的脚本,它通过提供高级工具来操纵场景中的对象颜色、材质和实例,从而增强了3D设计师和艺术家的工作流程。这个多功能脚本提供了一系列功能,旨在简化对象、组和实例的着色过程。 3DMAX对象颜色插件主要具有…...
安卓将子模块打aar包,并将其远程依赖打包进去
生成 AAR 包 在Android Studio Terminal 窗口输入以下命令: ./gradlew :monitor:assembleRelease把 monitor 换成你子模块的名称,不出意外的话 就会在下面目录生成相应aar文件 注意:如果你的Java运行环境是Java 8 则在老一点的AS上 可以运…...
python 提取视频中的音频 采用ffmpeg-python 库
要使用 ffmpeg-python 库从视频文件中提取音频,首先需要确保你的系统中已经安装了 FFmpeg 和 ffmpeg-python 库。以下是详细的步骤: 步骤 1: 安装 FFmpeg 确保你的系统中已经安装了 FFmpeg。如果你使用的是 CentOS,可以参照前面的回答来安装 …...
区块链的搭建和运维4
区块链的搭建和运维4 (1) 搭建基于MySQL分布式存储的区块链 1.构建单群组网络节点 使用开发部署工具构建单群组网络节点,命令如下: bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,85452. 启动 MySQL 并设置账户密码 输入如下命令,…...
数据驱动决策:内容数据产品经理的成长与价值
数据驱动决策:内容数据产品经理的成长与价值 内容数据产品经理以数据为媒介,在用户与决策之间搭建桥梁,通过理解分析模型和用户决策路径,设计产品以促成更多决策产出,创造用户价值。例如,在衡量数据产品经理…...
pyinstaller 打包python 提示 object has no attribute
参考: 错误: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语言交互
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ubuntu20.04搭建RUST开发环境并与C语言交互 前言开战一、确认环境版本二、环境搭建三、hello world!四、跟c语言进行交互1.rust调用C静态库2.C调用rust库 总结参考…...
C语言 ——— 学习、使用memmove函数 并模拟实现
目录 memmvoe函数的功能 学习memmove函数编辑 模拟实现memmove函数 memmvoe函数的功能 memmvoe函数的功能类似于memcpy函数,都是内存拷贝,唯一的区别是memcpy函数不能成功拷贝原数据,而memmvoe函数可以 举例来说: [1, 2, 3…...
职场中必须明白的三个道理,不明白无出头之日,你越早知道越好
职场中有很多优秀的人才,他们工作能力出众,为人处事也非常的善良,但是有时候,这样的优点反而成了他们在职场中被欺负的原因,因为他们太善良,很容易被别人利用,为了自己的利益,有些人…...
做webserver项目的一些问题和思路总结
1.webserver是做什么的?这个项目最后想实现什么? 网络服务器,是一个处理HTTP请求并返回HTTP响应的程序。(socket实现的是网络编程,不一定是HTTP,还有其他协议,具体协议由端口来确定)…...
DDrawCompat深度解析:让经典DirectX游戏在现代Windows重焕生机
DDrawCompat深度解析:让经典DirectX游戏在现代Windows重焕生机 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/d…...
pgloader:从数据孤岛到PostgreSQL的高效迁移引擎
pgloader:从数据孤岛到PostgreSQL的高效迁移引擎 【免费下载链接】pgloader Migrate to PostgreSQL in a single command! 项目地址: https://gitcode.com/gh_mirrors/pg/pgloader 一、工具定位与核心优势:为什么选择pgloader? 1.1 数…...
WebThings Gateway数据库设计与用户配置管理:深入理解网关数据持久化机制
WebThings Gateway数据库设计与用户配置管理:深入理解网关数据持久化机制 【免费下载链接】gateway WebThings Gateway - a self-hosted web application for monitoring and controlling a building over the web 项目地址: https://gitcode.com/gh_mirrors/gat/…...
3分钟解锁B站缓存视频:m4s-converter让你真正拥有数字收藏
3分钟解锁B站缓存视频:m4s-converter让你真正拥有数字收藏 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾在B站缓存了珍贵的…...
告别熬夜肝论文!揭秘百考通AI如何用“双降”黑科技,搞定毕业季全流程难题
摘要:毕业季临近,论文写作如同横在学子面前的“大山”——查重率、AI痕迹、格式规范、文献梳理、数据分析……每一项都令人头大。本文深度解析一款专注于学术科研的智能辅助平台——百考通AI,看它如何运用先进的自然语言处理与深度学习技术&a…...
010 Editor破解指南:从安装到激活的完整步骤
1. 010 Editor简介与破解前的准备 010 Editor是一款功能强大的十六进制编辑器,广泛应用于逆向工程、文件分析和数据恢复等领域。它的二进制编辑能力和模板解析功能深受安全研究人员和开发者的喜爱。不过正版软件价格较高,个人用户可能会考虑寻找替代方案…...
STK 9.2.2 实战:手把手教你用TLE文件导入中国空间站轨道数据
STK 9.2.2 实战:手把手教你用TLE文件导入中国空间站轨道数据 航天仿真领域的新手们常常被一个问题困扰:如何在自己的STK项目中快速添加真实卫星轨道数据?本文将带你从零开始,一步步完成中国空间站轨道数据的导入,避开那…...
Qwen3.5-9B视觉增强:OpenClaw自动处理截图中的文字
Qwen3.5-9B视觉增强:OpenClaw自动处理截图中的文字 1. 为什么需要自动处理截图文字 上周我需要整理一份移动端产品调研报告,手机截屏了二十多个竞品界面。当我把这些截图传到电脑上准备整理时,发现两个致命问题:一是部分截图文字…...
SEO 优化自学常见的误区有哪些
SEO 优化自学常见的误区有哪些 在互联网时代,SEO(搜索引擎优化)已经成为了提升网站流量和品牌知名度的关键。对于很多自学SEO的人来说,常常会犯一些错误,导致他们的努力难以见到实际效果。本文将详细探讨SEO 优化自学…...
D3KeyHelper:革新性暗黑3自动化助手,重新定义游戏效率体验
D3KeyHelper:革新性暗黑3自动化助手,重新定义游戏效率体验 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款…...

