Tbschedule源码阅读3:TbSchedule调度机的创建-----心跳Timer

心跳Timer实在创建调度机的时候(构造函数中)启动的。心跳Timer的主要作用是定时写入调度机的信息,任务分片的重新分配,加载最新任务分片;

  • 1.重写调度信息
    • 1.1判断是否被停止调度,若停止,方法直接返回,否则到1.2
    • 1.2发送心跳信息(写入当前调度服务的信息,执行情况),更新成功,直接返回,否则到下一步
    • 1.3 更新失败,需要清理当前任务项、执行线程加载的数据(清理内存数据)以及重新加载Item标志,并重新注册当前调度机。
  • 2.若初始化成功标志为false, 直接返回(当前manager内中的标志)【必须启动管理线程组以后,才能执行下面的所有步骤,否则心跳只会执行1】
  • 3.重新分配Task
    • 3.1 清理过期的调度服务机。【某个任务的所有调度服务机(管理线程组)】
    • 3.2 重新获取当前最新的该任务的调度机
    • 3.3 判断当前调度机是否为leader, 否不是,直接返回,否则执行下面的内容。
    • 3.4 将当前leader的uuid写到Item节点上
    • 3.5.重置所有的Item下cur_server不存在的节点(不在3.2的列表中),设置值为null
    • 3.6 重新分配TaskItem (按照12, 34,5这种放肆分配)当节点的cur_server 不存在,ok,直接给你。(分配的server写到cur_server下), 否则:cur_server已经存在了,则判断当前分配server是否与cur_server一致并且req_server为空,说明是已经符合预期分配,不操作,否则:将当前的分配的server挂在到请求server下。
  • 4.判断是否需要重新加载分片
    若内存中的版本号小于zk(server节点)的状态版本号时候,返回为true
  • 5.判断是否需要重新加载Item (当前标志和内存中标志不一致),如果不一样,需要设置内存重置标记为true,并重新执行第1步,重新写入server信息到zk
  • 6.加载当前调度机的任务分片: 判断是否暂定调度状态或者执行线程在睡觉(当前数据处理完毕,或者加载数据的时候没得数据,也即没得正在处理的数据),若是:
    • 6.1 获取当前所有的调度server(执行线程)
    • 6.2 获取最新的版本号(server节点下的版本号,同步骤4中的版本号)
    • 6.3 判断自己把持的任务是否有别人申请,若有则设置reload=true标志(server节点下的值)
    • 6.4 加载自己能处理的taskItem, (currentTaskItemList)若加载到taskItem, 更新最后加载的时间戳。

简略流程图:

心跳Timer流程图

下一节将讲述任务恢复暂停Timer另外,文章最开始写作于有道笔记,为一边读代码一边写入,部分内容可能没有及时同步。可移步至心跳Timer

猜你喜欢

转载自blog.csdn.net/Jiakunboy/article/details/80712025