Tbschedule源码阅读2:TbSchedule调度机的创建-----管理线程组的启动

当管理工厂Timer到达执行时间后,会新启动一个调度ManagerFactoryTImer,调度会根据实时的调度任务和机器信息重新计算每个策略在每个机器上分配的调度管理线程组个数。若当前调度管理器个数不足,那么需要新增。此时则需要创建一个管理线程组。
在创建的时候,构造器中的操作包括:1.将对调度时期用到的参数进行赋值,2. 并清理过期的调度任务; 3. 校验客户端的自己实现的Bean( 很简单,通过配置获取到全名的类,然后根据上下文获取对应的Bean. 然后利用instanceOf检验当前Bean是否实现了特定的接口),4. 注册当前调度机(一个线程组一个调度机. 将当前调度机的信息写入到ZK,比较Easy),5. 启动心跳Timer, 6. 初始化运行期间信息。【此时在创建的时候,构造器中做了很多操作,感觉和自己平时接触的,需要在构造器中做较少的操作相比,此处…….】
下面讲解下初始化运行期间信息的过程,其中心跳Timer的讲解放在下一篇讲解。其余部分的内容将不做过多的阐述。
运行期间信息的初始化另外开启了一个线程用于处理。其过程如下:

  • 1.初始化运行期间信息(此处是一个while循环,直到运行初始化成功isRuntimeInfoInitial=true),否则有如下:
    • 1.1 判断是否stopSchedule, 若是则直接返回,否则执行下面
    • 1.2 清理过期调度服务
    • 1.3 加载最新的调度server
    • 1.4 若当前调度为leader,执行如下,否则直接返回,while
    • 1.5 删除原有的Item节点,并重新创建目录taskItem目录,并且根据页面配置项(分片)来创建不同的taskItem子节点,以及cur_server等子节点
    • 1.6 将当前leader的uuid写入taskItem节点上【心跳线程中,在重新分配item的时候也有写入改值】
    • 1.7 判断刚刚写入的值是否为leader的uuid,若是,则设置初始化成功标志。【当其他的分布式机器(管理线程组)设置成功后,在当前线程组上获取并设置本线程组成功标志】,此时心跳timer可以开始工作了。。。。
  • 2.获取当前任务分片。同心跳任务中第6步骤,加载任务分片(其实此时需要等待心跳线程将最新的请求server等更新后才能获取到)
  • 3.启动任务恢复/暂停Timer
    • 3.1 若开始执行时间为空,立即执行,到步骤,否则
    • 3.2 若以startrun开头,那么设置为立即执行,并解析到后面的字符串(:)为表达式后执行后面步骤;
    • 3.3 获取当前时间后第一次执行的合法时间;
    • 3.4 开启任务执行管理timer,resume类型调度
    • 3.5 获取第一次执行时间的下一个合法时间,设置为下一次开始执行时间;
    • 3.6 若结束时间表达式不为空,获取第一次执行时间下的第一次结束时间(firstEndTime),获取当前时间下的第一次结束时间(nowEndTime),若firstEndTIme 和 nowEndTime不相等并且nowEndTime在当前时间后,那么设置为立即执行;并设置下次结束时间为nowEndTime;
    • 3.7 开启任务执行管理timer,pause类型调度
  • 4.若立即执行标志位true,则立即恢复调度
  • 5.重写调度信息

简要流程图:
管理线程组启动流程

Tips:
1. 每个机器上的每个策略对应N个调度机(管理线程组)

下一节将讲述心跳Timer的原理原始笔记可移步至Tbschedule源码阅读2:TbSchedule调度机的创建—–管理线程组的启动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值