TB-schedule的使用

使用方法

图片描述

  • 任务名称:对应调度策略中的任务名称
  • 任务处理的SpringBean:对应处理机中的Bean名称
  • 心跳频率(秒)/假定服务死亡间隔(秒):保持默认
  • 线程数:处理该任务的线程数,在没有划分多任务项的情况下,多线程是没有意义的,且线程数 大于任务项也是没有意义的。如果要开启多机多线程,必须对数据做任务项过滤
  • 处理模式:SLEEP(推荐)、NOSLEEP(单个线程处理完分配到的数据后,立刻会重新获取数据)
  • 每次获取数据量:子计时单元开始,线程会不断的去获取数据(eachFetchDataNum参数),直到获取不到数据子计时单元才结束
  • 每次执行数量:执行机实现IScheduleTaskDealMulti接口时使用,handleTask方法参数arg0的数量(taskTypeInfo中executeNumber)
  • 没有数据时休眠时长(秒):
    未设置开始时间:当获取不到数据时,休眠此时间,再执行获取数据操作
    设置开始时间,未设置结束时间:无效(实际上子计时单元即将停止了)
    设置开始时间,设置结束时间:当获取不到数据时,休眠此时间,再执行获取数据操作
  • 每次处理完数据后休眠时间(秒):子计时单元内,两次获取数据操作间隔(对于总会返回数据的任务,使用这个配置来控制间隔)
  • 执行开始时间:子计时任务开始时间
  • 执行结束时间:子计时任务结束时间
  • 单线程组最大任务项:配置单JVM处理的最大任务项数量,多任务项情况下,可按需限制,一般默认,多执行机会均衡分配(TBScheduleManager的任务调度器使用,未研究过。。)

图片描述

  • 策略名称:策略标示,随意填写
  • 任务类型:一般保持默认Schedule
  • 任务名称:对应任务栏被调度任务名称
  • 任务参数:一般不用,保持空
  • 单JVM最大线程组数量:单个JVM允许开启的线程数
  • 最大线程组数量:多处理机情况下的线程总数限制(总线程数为2,如果配置任务项的线程为4是没有意义的)
  • IP地址(逗号分隔):如图说明,此处注意多处理机如果没有根据任务项划分数据处理,会导致多处理机重复处理数据

TBScheduleProcessorSleep多线程工作原理

启动task配置的threadNum数量的线程去处理任务。由其中一个线程去获取任务并放入taskList队列中,所有的线程从这个队列中获取任务执行。如果是Multi任务,可以一次取多个任务执行。在一个线程获取任务的过程中,其他线程处于休眠状态,任务获取完毕唤醒其他线程。

  • TBScheduleProcessorSleep#loadScheduleData
  • IScheduleTaskDeal#selectTasks,由此方法的实现返回获取的任务
  • 两次loadScheduleData之间有休眠,即在task上配置的SleepTimeInterval(每次处理完数据后休眠时间)
  • 一旦TBScheduleProcessorSleep启动了,会一直循环执行,直到PauseTimer让其停止。但如果没有配置结束时间,则一直运行。(对于运行间隔较短的任务,应通过上述休眠时间来实现控制)

注意事项

  • 计划任务开始/恢复的时候Factory会创建TBScheduleProcessorSleepTBScheduleProcessorNotSleep对象;计划停止的时候,会将已经在执行的任务处理完,但是缓存在队列中带执行的任务将被丢弃
  • IScheduleTaskDealSingle和IScheduleTaskDealMulti两个接口,除了execute方法上参数不同,功能上没有区别
  • 处理模式为Sleep下getComparator()没有作用,一般情况下,使用Sleep模式

原理

zk数据的大致结构

factory部分:

/rootPath/factory
/rootPath/factory/facotoryUUID1
/rootPath/strategy
/rootPath/strategy/strategy1
/rootPath/strategy/strategy1/factoryUUID1
  • factory(永久节点)存储执行机注册的主机信息,每个执行机启动后,都会在factory下创建一个临时顺序子节点,该节点名是由TBSchedule源码生成的主机唯一标示。每个factory对应一个执行机启动的TBScheduleManagerFactory实例,每个JVM可以有多个factory实例,factory实例也可以存在于不同的JVM中。(一般一个JVM对应一个factory,即任务执行终端)
  • strategy(永久节点)是在调度机配置的任务策略,每个factory启动时候回去检查自己能处理哪几个strategy,如果能处理则在/rootPath/strategy/strategy1/路径下注册自己,注册的这个信息在tbschedule源码里叫做FactoryRunningInfo

调度配置为永久节点

[zk: 172.26.50.86:2181(CONNECTED) 56] get /rootPath/strategy/IScheduleTaskDealSingleTest
{"strategyName":"IScheduleTaskDealSingleTest","IPList":["127.0.0.1"],"numOfSingleServer":0,"assignNum":1,"kind":"Schedule","taskName":"IScheduleTaskDealSingleTest","taskParameter":"0","sts":"resume"}

[zk: 172.26.50.86:2181(CONNECTED) 57] get /rootPath/strategy/IScheduleTaskDealSingleTest/127.0.0.1$IAN$7D3122FC0C574603B6CFD0C146641A77$0000000000
{"strategyName":"IScheduleTaskDealSingleTest","uuid":"127.0.0.1$IAN$7D3122FC0C574603B6CFD0C146641A77$0000000000","requestNum":1,"currentNum":0,"message":""}

ScheduleServer部分:

/rootPath/baseTaskType
/rootPath/baseTaskType/task1
/rootPath/baseTaskType/task1/task1
/rootPath/baseTaskType/task1/task1/server
/rootPath/baseTaskType/task1/task1/server/scheduleServerUUID1
/rootPath/baseTaskType/task1/task1/taskItem
/rootPath/baseTaskType/task1/task1/taskItem/0
/rootPath/baseTaskType/task1/task1/taskItem/0/cur_server
/rootPath/baseTaskType/task1/task1/taskItem/0/deal_desc
/rootPath/baseTaskType/task1/task1/taskItem/0/parameter
/rootPath/baseTaskType/task1/task1/taskItem/0/req_server
/rootPath/baseTaskType/task1/task1/taskItem/0/sts
  • baseTaskType(永久节点)存储调度机创建的任务信息

例如:task1是在后台配置的任务。
/rootPath/baseTaskType/task1/task1/server/scheduleServerUUID1表示可以用来处理任务的调度器,每个factory实例可以有多个ScheduleServer实例。
/rootPath/baseTaskType/task1/task1/taskItem表示配置任务时,每个任务可以拆分成几个小的任务项。该节点的子节点,表示这个任务项运行时的信息,例如cur_server表示这个taskItem正在被哪个ScheduleServer处理。这些在tbschedule源码里也叫作runningInfo。

任务配置为永久节点

[zk: 172.26.50.86:2181(CONNECTED) 37] ls /rootPath/baseTaskType
[IScheduleTaskDealSingleTest]

[zk: 172.26.50.86:2181(CONNECTED) 39] get /rootPath/baseTaskType/IScheduleTaskDealSingleTest
{"baseTaskType":"IScheduleTaskDealSingleTest","heartBeatRate":5000,"judgeDeadInterval":60000,"sleepTimeNoData":500,"sleepTimeInterval":0,"fetchDataNumber":500,"executeNumber":1,"threadNumber":1,"processorType":"SLEEP","permitRunStartTime":"0 * * * * ?","expireOwnSignInterval":1.0,"dealBeanName":"iScheduleTaskDealSingleTest","taskParameter":"0","taskKind":"static","taskItems":["0"],"maxTaskItemsOfOneThreadGroup":0,"version":0,"sts":"resume"}

核心类图

图片描述

TBScheduleManagerFactoryfactory 实例对象,管理这个factory内部所有的事情。
ZKManager 负责与zk之间的连接,数据交换。
IScheduleDataManager 负责/rootPath/baseTaskType及其子节点所有数据模型维护。
ScheduleDataManger4ZK 负责/rootPath/factory、/rootPath/strategy及其字节点数据模型维护。
IStrategyTask 每个实例代表一个线程组,每个strategy可对应多个IStrategyTask实例,来真正处理配置的任务。

类之间的关系图:
图片描述

Factory 任务处理器(可以理解为JVM)
strategy 为配置的任务

一个Factory处理多个strategy,每个strategy下有多个IStrategyTask对象。
TBScheduleManager实现IStrategyTask接口,一个TBScheduleManager实例与ScheduleServer、IScheduleProcessor、IScheduleTaskDeal是一对一关系。
ScheduleServer是针对某个task的调度器
IScheduleProcessor是处理任务的多线程任务处理器,控制我们任务数据的循环执行(有TBScheduleProcessorSleepTBScheduleProcessorNotSleep两种实现)
IScheduleTaskDeal是我们需要实现的任务对象(架构组提供的AbstractTaskDealSingleAbstractTaskDealMulti为其abstract实现)

参考文章

http://www.jianshu.com/p/e925...
http://blog.csdn.net/taosir_z...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值