上一篇文章已经说到调度中心端如何进行任务管理及调度,本文将分析执行器端是如何接收到任务调度请求,然后执行业务代码的。
XxlJobExecutorApplication为我们执行器的启动项,其中有个XxlJobConfig的配置项,发现其中有个属性为adminAddresses,这个就是我们调度中心的地址。

XxlJobSpringExecutor

声明了init方法为start,点进来,
它又实现了ApplicationContextAware接口,用来保存spring的上下文信息。
它还有个父类XxlJobExecutor,暂时未找到其他子类。
程序开始执行start方法,
第一步,调用了本类的私有方法,这个方法就是把JobHandler的实现类取出来,再调用registJobHandler(name, handler)进行注册。
registJobHandler的实现方法在父类中,很简单,维护了一个Map,估计后面进行任务的执行时会来这个map里面进行查询。
第二步,估计是初始化了Glue的执行器。
第三步,调用父类的start方法,大部分的业务逻辑都在这里。
1.日志处理器初始化
2.向adminBizList字段中放入XxlRpcReferenceBean返回的代理类,作用之后会单独开一篇注册心跳的文章说明。
3.任务日志清除
4.任务结果回调处理线程
5.启动另一个执行器的执行线程XxlRpcProviderFactory这个类是XXl其他的开源项目,自研RPC。

XxlRpcProviderFactory

看名字就知道这个类是可以返回Rpc调用服务提供端的工厂类,接上文,看他的initRpcProvider方法。

由上面的代码跟进来,发现这就是启动了一个以netty作为通讯模型、Hessian作为序列化方式的、ExecutorServiceRegistry作为注册逻辑实现类的服务提供端。
接着我们向其添加一个服务,名称为ExecutorBiz,版本为null,处理请求的实现类为ExecutorBizImpl,最后我们调用start方法完成执行器端的服务暴露。

此时的ServiceRegistry为ExecutorServiceRegistry,调用其start,以30秒的间隔和调度中心进行心跳通知,然后调用server的start方法,此时server为NettyHttpServer。

整个代码结构就是用netty启动了个服务,来看最后一个ChannelHandler,NettyHttpServerHandler。

调用私有方法process。

这里调用了xxlRpcProviderFactory的invokeService方法完成了服务实现的反射调用。

从serviceData中拿到我们之前调用addService方法添加的服务实现类,这里是ExecutorBizImpl,这里反射调用的方法是run。

ExecutorBizImpl

这个类实现了ExecutorBiz接口,看接口定义的方法,主要是作为执行器,提供给调度中心几个接口方法。

重点来看run方法。

首先XxlJobExecutor内部会有个以jobId为key,执行这个任务的线程为value的字段jobThreadRepository,我们首先去尝试的获取当前正在执行这个任务的线程,如果有,那就根据任务设置的运行模式进行处理,如下图。

如果没有正在执行此任务的线程,那就调用XxlJobExecutor.registJobThread()启动一个线程,最后将任务数据推送给这个可能是从jobThreadRepository获取到的也可能是新创建的线程,如下图。

JobThread的run方法会从triggerQueue里poll出任务,然后用之前设置的 handler进行execute的方法调用,并利用idleTimes字段进行线程无任务空转的次数控制,如下图。

至此,执行器完成了启动,暴露ExecutorBiz服务,接收任务调度数据TriggerParam,并在JobThread线程中完成任务配置的业务handler的执行。

时序图

分布式调度平台XXL-JOB源码分析-执行器端的更多相关文章

  1. 深入理解分布式调度框架TBSchedule及源码分析

    简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...

  2. quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...

  3. 定时组件quartz系列<三>quartz调度机制调研及源码分析

    quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...

  4. (1)quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析 原文地址:http://demo.netfoucs.com/gklifg/article/details/27090179 引言quartz集群架构调 ...

  5. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

  6. Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析

    上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. ...

  7. Java调度线程池ScheduledThreadPoolExecutor源码分析

    最近新接手的项目里大量使用了ScheduledThreadPoolExecutor类去执行一些定时任务,之前一直没有机会研究这个类的源码,这次趁着机会好好研读一下. 该类主要还是基于ThreadPoo ...

  8. 美团分布式ID生成框架Leaf源码分析及优化改进

    本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...

  9. 【Cocos2d-x 3.x】 调度器Scheduler类源码分析

    非个人的全部理解,部分摘自cocos官网教程,感谢cocos官网. 在<CCScheduler.h>头文件中,定义了关于调度器的五个类:Timer,TimerTargetSelector, ...

随机推荐

  1. ztree实现拖拽移动和复制

    1.官网下载ztree:http://www.treejs.cn/v3/api.php 2.引入jquery.ztree.all.min.js 注意,这是基于jQuery的插件,请引入相关js 3.设 ...

  2. 十、Spring的@Profile注解

    首先我们来看看spring官方文档对这个注解的解释: The @Profile annotation allows you to indicate that a component is eligib ...

  3. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  4. Centos7挂载新硬盘

    1.查看系统是否检测到新的硬盘设备 ls /dev/ |grep sd linux 中所有外设都会在这个目录下,对应一个文件,其中第一块硬盘是sda,第二块硬盘是sdb,第三块硬盘是sdc.其中sda ...

  5. [转帖]WannaCry惊天大发现!疑似朝鲜黑客组织Lazarus所为

    WannaCry惊天大发现!疑似朝鲜黑客组织Lazarus所为 Threatbook2017-05-16共588524人围观 ,发现 17 个不明物体系统安全 https://www.freebuf. ...

  6. python with方法

    在实际的编码过程中,有时有一些任务,需要事先做一些设置,事后做一些清理,这时就需要python with出场了,with能够对这样的需求进行一个比较优雅的处理,最常用的例子就是对访问文件的处理. 一般 ...

  7. 用Python递归做个多层次的文件执行

    想用 递归实现多层次的 '.py'执行但是发现好像不能 import os def func(path): if os.path.isdir(path): for name in os.listdir ...

  8. doDBA工具使用详解

    目录 1.简介 2.下载 3.使用帮助 4.配置 4.1.模板 4.2.启动命令 5.部署流程 5.1.下载 5.2.选定被监控主机 5.3.在被监控主机上添加Linux用户.MySQL 用户 5.4 ...

  9. "CreateProcess error=206, 文件名或扩展名太长。",用gradle构建项目创建mapper文件时提示这个错误,是Windows Gradle长类路径问题,官方已经修复

    用gradle构建项目mapper文件时,提示这个错误,这个是Windows Gradle长类路径问题, gradle官方已经解决了这个问题. 官网给出的解决方法地址:https://plugins. ...

  10. Keyboard Purchase CodeForces - 1238E (状压)

    大意: 给定串$s$, 字符集为字母表前$m$个字符, 求一个$m$排列$pos$, 使得$\sum\limits_{i=2}^n|{pos}_{s_{i-1}}-{pos}_{s_{i}}|$最小. ...