初衷
-
工作中用到了很多架構,但是給我印象最深的還是我們PO(Product Owner)在若幹年前寫的一套任務排程架構,在JDK1.4之前,concurrent包還沒有引入,
手寫的這套Token排程,去年我們依然在使用,并且滿足了商用軟體的各種要求。
- 架構本身是可行的,但是也存在一些問題,比如,技術陳舊、互相引用、層次冗雜、不易讀等。
- 前車之鑒,并且結合我涉及的另外一套内部架構(讀寫架構),我想重新設計并實作一套新的任務排程架構。
- 取名為kunka,純屬雷同,并且i really have fun to do this.
概念
- Task,任務,最小排程和執行機關,執行内容,使用者自定義
- Executor,執行器,執行Task,根據執行方式分為,串行執行器,并發執行器,定時執行器,多子任務執行器等
- Dispather,排程器,負責排程,将Task放放入Executor,有自己的生命周期
- TaskManager, 任務管理中心,單例,負責管理是以進入待排程的Task,并管理任務狀态,并提供任務中斷接口
- TaskListener,任務監聽器,Task狀态變動時,會通知監聽器
架構排程流程
- 使用者實作一個Task,并實作對任務狀态變更的TaskListener,其中ID要對應
- 使用者根據需要,選擇一種執行器Executor
- 使用者将Task、TaskListener和Executor放入到TaskManager中
- 排程器開始運作,執行器接受到排程器分發的Task,并執行
- Task狀态變更時,通知所有注冊的TaskListener
- 排程器會在生命周期結束時,自動關閉,同時關閉相關的執行器
接口說明
Task
/**
* 任務執行内容
*/
abstract public void runTask();
/**
* 任務逾時處理
*/
abstract public void timeOutAction();
/**
* 任務結束時,後置處理
*/
abstract public void taskFinished();
I am a slow walker, but I never walk backwards.