需求背景描述:
我有一個(gè)溫濕度數(shù)據(jù)采集的物聯(lián)網(wǎng)系統(tǒng),每個(gè)租戶都需要定時(shí)執(zhí)行若干種任務(wù),?不同的租戶,?他定時(shí)執(zhí)行的間隔不一樣 ,比如?
A租戶,數(shù)據(jù)保存間隔60秒,數(shù)據(jù)是否超限的輪詢間隔是是600秒,?
B租戶,數(shù)據(jù)保存間隔是300秒,數(shù)據(jù)是否超限的輪詢間隔是1800秒。
經(jīng)過(guò)查閱abp官網(wǎng)文檔,和quartz資料,得到如下思路:
1、用quartz來(lái)排隊(duì)執(zhí)行后臺(tái)工作者,需要一個(gè)job執(zhí)行隊(duì)列表。
2、搞一個(gè)定時(shí)任務(wù),最簡(jiǎn)單的比如timer,然后定時(shí)去獲取所有租戶的定時(shí)任務(wù)間隔時(shí)間,看看是否有修改,有修改就按照新的定時(shí)任務(wù)輪詢間隔,給job表按租戶更新新的執(zhí)行隊(duì)列行。
3、然后quartz就不停的排隊(duì)定時(shí)去job執(zhí)行對(duì)列表中領(lǐng)取任務(wù)執(zhí)行。
具體執(zhí)行思路如下:
1、定義?一個(gè)job隊(duì)列表,包含字段:
任務(wù)id,租戶id,執(zhí)行的業(yè)務(wù)類型(按setinfo表對(duì)應(yīng)的設(shè)置字段名來(lái)填,也可以理解為任務(wù)組別),任務(wù)名稱,執(zhí)行時(shí)間間隔,開始執(zhí)行時(shí)間,停止執(zhí)行時(shí)間,上次執(zhí)行時(shí)間,下次執(zhí)行時(shí)間,執(zhí)行次數(shù)(可選),失敗次數(shù)(可選),執(zhí)行狀態(tài)鎖(1執(zhí)行中,0空閑中),任務(wù)狀態(tài)(0,停止,1啟動(dòng))。
job隊(duì)列表以租戶和執(zhí)行的業(yè)務(wù)類型2個(gè)字段來(lái)判斷唯一值,每個(gè)租戶同一個(gè)執(zhí)行類型只允許有一行數(shù)據(jù)。
比如租戶A,執(zhí)行類型offline ,執(zhí)行周期60秒
租戶B,執(zhí)行類型savetime,執(zhí)行周期1800秒
2、搞一個(gè)普通的后臺(tái)工作者,比如定時(shí)1分鐘去掃描一次setinfo表,然后遍歷分析看看每個(gè)租戶的各項(xiàng)需要執(zhí)行的判定周期是否有變動(dòng),如果有變動(dòng)就到j(luò)ob隊(duì)列表,新增或者修改這個(gè)租戶對(duì)應(yīng)的執(zhí)行業(yè)務(wù)類型的周期值。
3、搞個(gè)quartz后臺(tái)工作者,定期調(diào)用業(yè)務(wù)執(zhí)行類PeriodicJudgmentService類的PeriodicJudgmentData方法,這個(gè)方法業(yè)務(wù)為:
讀取job隊(duì)列表數(shù)據(jù),遍歷所有job數(shù)據(jù)行,
如果當(dāng)前時(shí)間和job行上次執(zhí)行時(shí)間的差是大于job的執(zhí)行時(shí)間間隔列的值(2023-6-1新思路修改為用下一次執(zhí)行時(shí)間來(lái)與當(dāng)前時(shí)間比較,當(dāng)前時(shí)間大于下次執(zhí)行時(shí)間就執(zhí)行一次),我們就需要根據(jù)租戶ID查詢到setinfo、tmplist、descList信息裝填到定義的變量,做好數(shù)據(jù)準(zhǔn)備。
然后根據(jù)job的類型,將上面準(zhǔn)備好的數(shù)據(jù)變量做參數(shù)傳遞,去調(diào)用執(zhí)行指定的業(yè)務(wù)邏輯方法,比如離線判斷一個(gè)方法,數(shù)據(jù)超限判斷一個(gè)方法,數(shù)據(jù)保存一個(gè)方法。
4、其實(shí)還可以根據(jù)job的執(zhí)行類型,來(lái)分別建立quartz后臺(tái)工作者,
比如離線判斷一個(gè)工作者,數(shù)據(jù)超限判斷一個(gè)工作者,數(shù)據(jù)保存一個(gè)工作者,這樣可能不同業(yè)務(wù)分開執(zhí)行,能更好的隔離各任務(wù)類型,并且確保不同的業(yè)務(wù)類型的執(zhí)行安全程度。
2023-5-13日臨時(shí)思考記錄:
每個(gè)任務(wù)類型的執(zhí)行隊(duì)列,那么多行,怎么判斷是否執(zhí)行完成了一輪是個(gè)問(wèn)題,是否需要在隊(duì)列表中加執(zhí)行順序。或者是否要考慮再加一個(gè)任務(wù)執(zhí)行記錄表,記錄執(zhí)行了哪些任務(wù)。
2023-6-1日記錄:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-440890.html
因?yàn)榍岸藭r(shí)間被老項(xiàng)目任務(wù)拖累,一直到現(xiàn)在才有空重新回來(lái)做這個(gè)沒做完的定時(shí)任務(wù)邏輯。重新回顧了一下5-13日的問(wèn)題, 給job表增加 下次執(zhí)行時(shí)間? 字段可以解決問(wèn)題,這樣只用在每次遍歷job表的時(shí)候任務(wù)的下次執(zhí)行時(shí)間是否已經(jīng)到達(dá)了,當(dāng)前時(shí)間到達(dá)或超過(guò)下次執(zhí)行時(shí)間都可以執(zhí)行,每次執(zhí)行完一行作業(yè)任務(wù),就把下次執(zhí)行時(shí)間加上執(zhí)行間隔,更新為新的下次執(zhí)行時(shí)間。? 不過(guò)這樣要考慮業(yè)務(wù)配置的執(zhí)行間隔不能比quartz工作者本身的執(zhí)行間隔還短,不然永遠(yuǎn)都追不上任務(wù)下一次的執(zhí)行時(shí)間,會(huì)越拉越長(zhǎng),比如quartz工作者本身是20秒執(zhí)行一次, 那所有的job任務(wù)執(zhí)行間隔應(yīng)該要超過(guò)20秒。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-440890.html
到了這里,關(guān)于abpvnext后臺(tái)工作者使用quartz擴(kuò)展的一些思路和使用細(xì)節(jié)記錄--(未完待續(xù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!