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部分:fetch

/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。ui

任務配置爲永久節點spa

[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實例,來真正處理配置的任務。.net

類之間的關係圖:
圖片描述線程

Factory 任務處理器(能夠理解爲JVM)
strategy 爲配置的任務3d

一個Factory處理多個strategy,每一個strategy下有多個IStrategyTask對象。
TBScheduleManager實現IStrategyTask接口,一個TBScheduleManager實例與ScheduleServer、IScheduleProcessor、IScheduleTaskDeal是一對一關係。
ScheduleServer是針對某個task的調度器
IScheduleProcessor是處理任務的多線程任務處理器,控制咱們任務數據的循環執行(有TBScheduleProcessorSleepTBScheduleProcessorNotSleep兩種實現)
IScheduleTaskDeal是咱們須要實現的任務對象(架構組提供的AbstractTaskDealSingleAbstractTaskDealMulti爲其abstract實現)code

參考文章

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

相關文章
相關標籤/搜索