分布式调度框架Tbschedule运行流程【03】

tb-schedule调度:
             1.初始化ZK连接
             2.创建 baseTaskType节点,检测 本机与注册中心的心跳时间差
             3.初始化 factory目录,和strategy目录
             4.注册manageFactory ,在factory目录下面添加 本机IP的节点 节点规则  
             5.遍历strategy目录,看看是否有策略IP在自己测管理范围之内的,有的话建立子节点在策略目录下面
             6.timer.schedule(ManagerFactoryTimerTask, 2000, this.timerInterval);定时任务校验ZK连接状态以及如果五次连接状态失败,则 重新进行1,2,3,4,5步骤;
             zk连接状态为成功,则刷新;如果工厂状态为false 停止所有的调度任务,设置调度状态 标志为停止; 清理 清除所有未处理任务,但已经进入处理队列的,需要处理完毕 this.taskList.clear();
             此定时任务会每隔2S执行一次,检测ZK连接状态,如果连接状态连续5此失败,则重新连接。如果连接状态正常则执行refresh操作。
             7.接着6. refresh()分析  获取 当前服务器所在的factory目录下面的uuid下面的数据 如果数据NULL则 设置start =true; 否则设置结果为获取的数据,
             如果:factory目录下面的此服务的节点状态为false 
             stopServer(null); // 停止所有的调度任务
             this.getScheduleStrategyManager().unRregisterManagerFactory(this);
             否则:
             重新注册管理工厂
             reRegisterManagerFactory();
                        --(7.1)registerManagerFactory(this);重复步骤 5.
                        --(7.2.)遍历返回的自己管辖范围内的策略,停止本机管理范围内的调度任务
                        --(7.3)assignScheduleServer();根据策略重新分配调度任务的机器 
                             7.3.1 this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByUUID(this.uuid)
                              遍历strategy目录获取 子节点名称列表,如果存在 strategy/strategyName/factoryUuid的目录加入列表返回;
                              此处的factoryUuid是当前JVM注册成功后分配的号;IP$主机名$uuid$序列号
                               返回的列表也是和自己相关的列表
                             7.3.2 loadAllScheduleStrategyRunntimeByTaskType(String strategyName) ;获取路径为strategy/策略名称 目录的子目录,
                             截取子目录的序列号 进行排序,根据排序后的子目录获取策略子目录下面的数据,封装成列表返回;判断当前管理器是否是 Leader;挑选序号最小的做Leader;
                             如果当前Factory不是Leader跳过本次循环继续下次循环;如果是Leader当前循环策略的任务分配
                             7.3.3  public static int[] assignTaskNumber(int serverNum, int taskItemNum, int maxNumOfOneServer)任务分配
                             参数解析:* @param serverNum 总的服务器数量
                                      * @param taskItemNum 任务项数量
                                      * @param maxNumOfOneServer 每个server最大任务项数目
                                      此处的总的服务器数量可以理解为当前策略下面 有个JVM注册上来;
                                      任务项数:就是 tbschedule-conse后台任务里面填写的任务分隔项,或者称之为任务切片的数量,
                                      maxNumOfOneServer:就是单个JVM做多能分配几个Item切片;这个是针对单一任务策略的;
                            7.3.4 循环更新 JVM某个策略应该分配的切片任务量public void updateStrategyRunntimeReqestNum(String strategyName, String manangerFactoryUUID, int requestNum)
                                  将此信息更新到 策略下面的对应的 子目录下的 data数据
                                  {"strategyName":"DemoTaskStrategy","uuid":"192.168.109.100$mini1$E7E3B19A1F9E4F62AE96B226C8CB9F2E$0000000003","requestNum":1,"currentNum":0,"message":""}
                                  requestNum=1代表分配到了一个切片
                                  
                         (7.4)reRunScheduleServer()重新开始调度
                               重复7.3.1步骤 查出此调度器管辖的策略列表    
                                如果策略下的服务器列表大于 切片任务数且策略列表大于
                                 不足增加调度器,获取当前策略的 data数据    
                                  创建调度服务器 任务类型为 Schedule    
                         new TBScheduleManagerStatic(this, baseTaskType, ownSign, scheduleDataManager);                                  
                                      
            8. 真正干活的来了:接着7.4    new TBScheduleManagerStatic(this, baseTaskType, ownSign, scheduleDataManager);     
                                         ->BScheduleManager(TBScheduleManagerFactory aFactory, String baseTaskType, String ownSign,
        IScheduleDataManager aScheduleCenter);
                         8.1清除过期的组合。超过一天没有活动的Server视为过期
                         8.2 如果5倍心跳时间大于 死亡判断时间,则抛出异常,心跳检测超时;
                         8.3ScheduleServer.createScheduleServer(this.scheduleCenter, baseTaskType, ownSign, this.taskTypeInfo.getThreadNumber()) 封装任务定时执行信息
                         8.4 scheduleCenter.registerScheduleServer(this.currenScheduleServer);注册任务定时调度执行服务器,其实是在baseTask/xxxTask/server下面添加相应的节点
                         8.5this.heartBeatTimer.schedule(new HeartBeatTimerTask(this), new java.util.Date(System.currentTimeMillis() + 500), this.taskTypeInfo.getHeartBeatRate()) 任务执行的心跳检测服务
                             进行心跳检测
           9. initial(); 新创建了一个线程,并运行 如果初始化状态==false则一直循环直到初始化状态完成
               computerStart();---> this.resume("开启服务立即启动");
               --->this.processor = new TBScheduleProcessorSleep(this, taskDealBean, this.statisticsInfo);
           
           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值