当前位置: 首页 > 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一段时间
http://www.lryc.cn/news/418260.html

相关文章:

  • C++ GDl+ 多张图片合并生成GIF动画格式图片
  • 【C++】模拟实现list
  • 怎么使用git merge合并两个分支?
  • ios 5.5寸、ipad13英寸如何截屏
  • spdlog日志库--输出格式(fmt 库集成)
  • Docker简介 MacM1安装Docker
  • 【Linux】yum软件包管理器(使用、生态、yum源切换)
  • 群晖NAS安装Video Station结合内网穿透实现远程访问本地存储的影音文件
  • Vue中@click.stop与@click.prevent
  • 沐风老师3DMax对象随机颜色插件使用方法
  • 安卓将子模块打aar包,并将其远程依赖打包进去
  • python 提取视频中的音频 采用ffmpeg-python 库
  • 区块链的搭建和运维4
  • 数据驱动决策:内容数据产品经理的成长与价值
  • pyinstaller 打包python 提示 object has no attribute
  • ubuntu20.04搭建RUST开发环境并与C语言交互
  • C语言 ——— 学习、使用memmove函数 并模拟实现
  • 职场中必须明白的三个道理,不明白无出头之日,你越早知道越好
  • 做webserver项目的一些问题和思路总结
  • 大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
  • 基于S7-200 SMART实现PID控制仿真实验
  • 社交及时通讯平台完整版源码,uniapp技术,可打包成app
  • TensorFlow和Pytorch是什么?干什么用的?
  • 采购人可否自行选择采购方式?|数智化招采系统支持多种采购方式
  • ubuntu dde 改为中文
  • Nginx配置小细节,location和proxy_pass 斜杠/ 问题
  • java 解析 PDF OFD 发票 部分文字缺失
  • C/C++数字与字符串互相转换
  • [Spring] Spring AOP
  • 鸿蒙 webview 实现顶部 Progress进度条