首页 > 其他分享 >xxl-job自动检测执行器周期

xxl-job自动检测执行器周期

时间:2023-04-14 18:55:47浏览次数:47  
标签:执行器 admin 自动检测 time update job JobRegistryHelper Executor

XXL-Job 自动检测执行器周期,执行器上下线的源码分析   XXL-Job 的自动注册和心跳检测代码相当简洁,本文继续分析它的 JobRegistryHelper 类是如何实现的,虽然只有短短的两百多行,但是值得一看。 本文要阐述两个问题:

  1. XXL-Job 是如何检测下线 Executor 且更新集群信息的?
  2. XXL-Job 的执行器心跳检测是谁发起的,后台做了什么操作?
JobRegistryHelper 类图结构 JobRegistryHelper 实现上面两个功能,它的类图结构:  拆解该类:  
public class JobReqistryHelper (
    private static Logger logger= LoggerFactory.getlogger(JobRegistryHelper.class);
    private static JobRegistryHelper instance = new JobReqistryHelper();public static JobReqistryHelper getInstance() ( return instance; 
    private ThreadpoolExecutor reqistryOrRemoveThreadPool = null;
    private Thread registryMonitorThread;
    private volatile boolean tostop = false;

  

  1. 一个单例类。
  2. 有一个线程池 
registryOrRemoveThreadPool,异步处理 Executor 的注册请求,更新 Registry 表的  update_time 字段。
  1. 有一个轮询线程 
registryMonitorThread,轮询  findDead 的结果集删除失联记录,遍历  findAll 存活状态的执行器更新 Group 集群数据的  address_list 字段。 检测下线执行器并更新集群的流程 该类启动了一个轮询线程 registryMonitorThread,它的 run 只做了两件事:
  1. findDead 查找 90 秒以内未更新过的执行器,视为无效记录,并删除;
  2. findAll查询有效执行器,以执行器的 
app_name 归并到 Group 表中对应集群的  address_list 字段。 有这个线程,控制平台就能自动感应执行器的上下线了,用到的两个 SQL 可以看看: <select id="findDead" parameterType="java.util.HashMap" resultType="java.lang.Integer" > SELECT t.id FROM xxl_job_registry AS t WHERE t.update_time <![CDATA[ < ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND) </select> <select id="findAll" parameterType="java.util.HashMap" resultMap="XxlJobRegistry"> SELECT <include refid="Base_Column_List" /> FROM xxl_job_registry AS t WHERE t.update_time <![CDATA[ > ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND) </select> 复制代码 findDead 的条件是 update_time < nowTime - timeout【90秒】,即上次更新时间为 90 秒之前,而执行器端的心跳周期是 30 秒,超过这个时间,视为失联。 findAll 则相反,update_time > nowTime - timeout【90秒】。 值得注意的是,改造成 Oracle 和 Postgre 时,如果不用传递的 nowTime ,而用数据库的 NOW() 或者 sysdate ,那么必须保证数据库服务器的时间和执行器主机时间相差不超过 90 秒,否则 admin 将永远检测不到存活状态的执行器。 执行器注册流程 最初跟踪心跳检测的过程,从 Executor 端找 beat 关键字开始,但这个心跳请求是 admin 端在触发调度 run 之前发起的,并没有涉及到 Registry 表的更新。所以放弃该思路,从 admin 端 DAO 的调用入手。 XxlJobRegistryDao 类操作 Registry 表的 registryUpdate 方法只在一个地方被调用了,就是 JobRegistryHelper 异步提交任务的代码:  继续跟踪 registry ,一路就到了 admin 模块的 API 部分:  它就是 Executor 端向 admin 中心发送的注册请求的 API。我觉得这里定义为 “registry” 不恰当,它的本质是 Executor 端的一个心跳线程,每隔 30 秒就向注册中心发送注册请求。   0   0 因此,第二个问题的答案:Executor 端自动向 admin 发送心跳,然后 admin 端会更新注册表 xxl_job_registry 表对应记录的 update_time 字段,这个字段将是 admin 模块判断执行器上下线的依据。      

标签:执行器,admin,自动检测,time,update,job,JobRegistryHelper,Executor
From: https://www.cnblogs.com/muyi-yang/p/17319318.html

相关文章

  • Ubuntu开机卡“A start job is running for wait for network to be Configured”的解
    问题虚拟机安装ubuntu22.04TLS系统后,开机总会卡在等待网络连接好长时间。卡在AstartjobisrunningforhaitforNetworktobeConfigured(1min40s/no)这里如图所示解决办法进入系统后,打开终端,输入下面命令,cd/etc/systemd/system/network-online.target.wants/......
  • jenkins清理jobs中不存在的workspace,可能job已被删除,workspace还在占用存储空间
    #!/bin/bash##jenkins-workspace-clean-by-jobs.sh##循环寻找jobs任务文件夹forfilein/var/lib/jenkins/workspace/*doif[-d"$file"];thenjob_name=`basename$file`if[[!-d"/var/lib/jenkins/jobs/$job_......
  • JOB实现定时收集特定用户的统计信息
    --创建存储过程createprocedureanalyze_table_elan4is--analyze_table_elan4存储过程名,自定义begindbms_stats.gather_schema_stats(ownname=>'ELAN',--修改要收集统计信息的用户options=>'GATHER',estimate_percent=>dbms......
  • XXL-JOB定时任务框架(Oracle定制版)
    特点xxl-job是一个轻量级、易扩展的分布式任务调度平台,能够快速开发和简单学习。开放源代码并被多家公司线上产品使用,开箱即用。尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xxl-job是针对MySQL设计的,所以使用起来需要进行一些魔改。为了方便后人使用,我已经创建了许......
  • Centos 7 安装部署 xxl-job
    1.xxl-job部署前需要的环境-Maven3+-Jdk1.8+-Mysql5.7+2.xxl-job下载地址官网地址https://www.xuxueli.com/xxl-job/源码地址https://github.com/xuxueli/xxl-job/3.在源码地址下载zip源码,下载项目源码并解压导入IDEA(maven要配置好阿里云的远程仓库,idea要配置好......
  • Springboot+ElasticJob-Lite实现集群任务调度
    前言ElasticJob-Lite是集群环境下应用(比如SpringCloud微服务)任务调度的解决方案。集群部署的时候,一个定时任务会有多个进程执行,如果不进行任何处理,会导致任务触发的时候每个进程重复执行一次。解决办法有两种:一种是加锁,保证同时只有一个进程执行任务,比如用分布式锁,或者用任务调......
  • 在Linux部署ElasticJob-Lite-UI运维控制台
    前言ElasticJob-Lite-UI是任务的分布式调度解决方案(ElasticJob-Lite)搭配的可视化运维控制台。运维控制台和ElasticJob-Lite并无直接关系,是通过读取作业注册中心(Zookeeper)数据展现作业状态,或更新注册中心数据修改全局配置。它具有这些功能:登录安全控制;注册中心、事件追踪数据源管......
  • 为什么我推荐你使用 systemd timer 替代 cronjob?
    概述前几天在使用Terraform+cloud-init批量初始化我的实验室Linux机器。正好发现有一些定时场景需要使用到cronjob,进一步了解到systemdtimer完全可以替换cronjob,并且systemdtimer有一些非常有趣的功能。回归话题:为什么我推荐你使用systemdtimer替代cronjo......
  • xxl-job 详解
    1.基本概念1.1定时任务是什么?定时任务是在约定时间内执行的一段程序。批量处理数据:批量统计上个月的某个数据。时间驱动的场景:某个时间点发送短信、邮件。固定频率的场景:每隔5分钟需要执行一次。1.2用cron表示时间cron表达式是一个字符串,以5或6个空格隔开,分为6......
  • java xxljob 根据参数运行业务
    配置定时任务不启动,手动执行根据传入的参数完成既定的业务 /** *自定义增删除平台酒体数据 *参数:startDate,endDate[yyyy-MM-dd) * *@return{@link*@return:com.xxl.job.core.biz.model.ReturnT<java.lang.String>} *@author:xxx *@date2023/3/12 **......