一、event事件、listener、dispatcher
一、初始化 listener、dispatcher.jobhandlers
初始化 不同任務型別的listener
獲取前2天到當前的 所有action_id的詳細資訊 (預設配置2天)
將所有的 action_id 新增進 dispatcher.jobhandlers
將action_id列表 放入記憶體中 heraactionmap
// master
public
void
init
(mastercontext mastercontext));
});
二、生成版本 generatebatchaction
獲取hera_job所有的job資訊
actionmap 初始化為 heraactionmap (兩天內的所有action_id)
將定時任務生成版本 generateschedulejobaction (解析quartz表示式)
如果 hera_job列表裡排程型別是 定時排程的job,則解析quartz表示式,生成action_id版本
生成的action_id版本,如果存在資料表hera_action中,去update操作,否則insert
生成的action_id版本,往actionmap裡 新增上新增的版本
遍歷所有依賴任務 單個生成版本 generatedependjobaction
如果該任務的依賴任務之前沒有處理過,那麼遞迴呼叫generatedependjobaction
直到該任務的所有依賴任務都處理過,優先找到該任務的所有依賴任務中版本數最少的
如果依賴任務中,版本數相同,找去時間較大的那個依賴 (action_id更大的)
該依賴任務的action_id, 是根據 所有依賴任務中 版本數最少 且 時間最大的 那個生成的
該依賴任務的 依賴action_id列表,是依賴任務中的所有版本 選乙個時間最接近 step4生成的 action_id
生成action_id版本,往actionmap裡 新增上新增的版本
如果執行的時間 在23點之前, heraactionmap = actionmap (更新快取在記憶體中的 action_id列表)
dispatcher.jobhandlers 新增上 新增的 action_id對應的 jobhandler
如果生成的版本 大於當前時間,傳送更新版本事件 herajobmaintenanceevent
// master
private
boolean
generateaction
(boolean issingle, integer jobid)
long nowaction = long.
parselong
(currstring)
; map
actionmap =
newhashmap
<
>
(heraactionmap.
size()
);list
joblist =
newarraylist
<
>()
;//批量 生成版本
//step 1. 獲取hera_job所有的job資訊
joblist = mastercontext.
getherajobservice()
.getall()
; string crondate = actionutil.
getactionversionprefix
(now)
; map
> idmap =
newhashmap
<
>
(joblist.
size()
);map
jobmap =
newhashmap
<
>
(joblist.
size()
);//step 2. 定時任務生成版本 (解析quartz表示式)
generateschedulejobaction
(joblist, crondate, actionmap, nowaction, idmap, jobmap)
;for
(map.entry
entry : jobmap.
entryset()
)if(executehour < actionutil.action_create_max_hour)
dispatcher dispatcher = mastercontext.
getdispatcher()
;if(dispatcher != null)}}
} schedulelog.
info
("[單個任務:{},任務id:{}]generate action success"
, issingle, jobid)
;return
true;}
}catch
(exception e)
finally
return
false
;}
三、清理版本 clearinvalidaction
移除15分鐘前的 定時任務版本
移除大於當前時間,並且不在heraactionmap中的版本(資料表hera_action刪除、dispatcher.jobhandlers也刪除對應的jobhandler)
// master
private
void
clearinvalidaction()
else
if(aid >= currdate && aid < nextday)}}
);}}
linux排程器原始碼分析 初始化 二
上期文章linux排程器原始碼分析 概述 一 已經把排程器相關的資料結構介紹了一遍,本篇著重通過 說明排程器在系統啟動初始化階段是如何初始化和工作的。通過上期文章我們知道,在多核cpu和smp系統中,每個cpu 多核cou中的每個核 都有自己的struct rq佇列,而rq佇列中又有著自己的stru...
linux排程器原始碼分析 初始化 二
上期文章linux排程器原始碼分析 概述 一 已經把排程器相關的資料結構介紹了一遍,本篇著重通過 說明排程器在系統啟動初始化階段是如何初始化和工作的。通過上期文章我們知道,在多核cpu和smp系統中,每個cpu 多核cou中的每個核 都有自己的struct rq佇列,而rq佇列中又有著自己的stru...
SRIO系統初始化過程和路由配置
qq群 852283276 b站 主頁 rapidio規範 rapidio rev 2.2 specification 書籍 rapidio the embedded system interconnect 系列部落格srio學習 系列部落格rapidio 還介紹了tsi721 xilinx zyn...