摘要:也有,觸發(fā)點和相關(guān),和我們的需求關(guān)系不大,暫忽略。實現(xiàn)為每個算法任務(wù)創(chuàng)建一個,任務(wù)失敗不能啟動后續(xù)任務(wù),所以在運行失敗的情況下,需要把啟動的刪除掉。需要自己在中實現(xiàn)多個依賴是否完成的檢查。后續(xù)主線程的任務(wù)就是檢查工作流是否已經(jīng)完成。
Quartz簡介
作為一個優(yōu)秀的開源調(diào)度框架,Quartz 具有以下特點:
強大的調(diào)度功能,支持立即調(diào)度、定時調(diào)度、周期調(diào)度、并發(fā)調(diào)度;
靈活的應(yīng)用方式,支持job間通過listener實現(xiàn)依賴調(diào)度,可以方便的進行調(diào)度組合,支持調(diào)度數(shù)據(jù)的多種存儲方式;
分布式和集群能力;
作為 Spring 默認的調(diào)度框架,Quartz 很容易與 Spring 集成實現(xiàn)靈活可配置的調(diào)度功能。
對于工作流需要滿足以下需求:
支持任務(wù)按照順序進行調(diào)度(這是工作流的基本需求)
存在多任務(wù)并發(fā)調(diào)度的情況
存在某一個任務(wù)等待多個上游任務(wù)都結(jié)束才啟動調(diào)度的情況
任務(wù)失敗后,依賴該任務(wù)的下游結(jié)點要停止運行
Quartz的主要組件如下圖所示,任務(wù)調(diào)度三個主要的類是 Scheduler、Trigger、Job。
Scheduler 是執(zhí)行調(diào)度的控制器。
Trigger 是用于定義調(diào)度時間的元素,我們項目沒有定時調(diào)度的需求,所有調(diào)度都選用理解觸發(fā)就可以了。
Job 表示被調(diào)度的任務(wù),Job和Trigger成對傳遞給Scheduler,當Trigger的條件滿足時,它對應(yīng)的Job就會被Scheduler觸發(fā)。
Trigger/Job的組合不能實現(xiàn)順序調(diào)度,實現(xiàn)順序調(diào)度需要用到JobListener,JobListener對指定Job進行監(jiān)聽,如上圖所示,JobLisener可以捕捉到三個任務(wù)觸發(fā)點.
我們需要的是在Job已執(zhí)行完成這個觸發(fā)點,把下一個Job啟動起來。
也有TriggerLisener/SchedulerLisener,觸發(fā)點和Trigger、Scheduler相關(guān),和我們的需求關(guān)系不大,暫忽略。
為每個算法任務(wù)創(chuàng)建一個Job,任務(wù)失敗不能啟動后續(xù)任務(wù),所以在job運行失敗的情況下,需要把啟動Job的JobLisener刪除掉。
public class HelloJob implements Job { private String JobName; public HelloJob(String name) { JobName = name; } public void execute(JobExecutionContext context) throws JobExecutionException { /* 獲取傳遞參數(shù) */ JobDataMap jobDataMap = context.getMergedJobDataMap(); /* 從jobDataMap中獲取下游JobLisener名稱 */ /* 執(zhí)行spark mlib 作業(yè) */ if (/* 執(zhí)行失敗 */){ /* 刪除依賴本任務(wù)的JobLisener */ context.getScheduler().getListenerManager().removeJobListener("next_job_lisener"); } /* 當前任務(wù)結(jié)果寫入數(shù)據(jù)庫 */ } }
基于所有的依賴關(guān)系,創(chuàng)建JobLisener,并將JobLisener與它依賴的Job綁定,在JobLisener中將下一步的Job啟動起來。
public class HelloJobListener implements JobListener { private String lisenerName; private JobDetail nextJob; HelloJobListener(String name, JobDetail job){ lisenerName = name; nextJob = job; } public String getName() { return lisenerName; } public void jobWasExecuted(JobExecutionContext inContext,JobExecutionException inException) { /* 創(chuàng)建Trigger */ Trigger trigger = newTrigger() .withIdentity(lisenerName) .startNow() .build(); inContext.getScheduler().scheduleJob(nextJob, trigger); try { /* 拉起下一個Job */ inContext.getScheduler().scheduleJob(nextJob, trigger); } catch (SchedulerException e) { e.printStackTrace(); } } }
當前任務(wù)依賴多個上游Job時,試驗了AndMatcher,這個方法是對多個條件進行判斷的接口,不能進行多上游依賴判斷。
需要自己在JobLisener中實現(xiàn)多個依賴是否完成的檢查。JobLisener需要知道其它依賴的完成情況,并且在自己完成后更新自己的狀態(tài)。
所有Job、JobLisener的關(guān)系配置好以后,調(diào)用scheduler.start()就可以啟動整個調(diào)度。
后續(xù)主線程的任務(wù)就是檢查工作流是否已經(jīng)完成。每個任務(wù)結(jié)點在任務(wù)完成后,會將當前任務(wù)結(jié)點的的運行結(jié)果寫入數(shù)據(jù)庫或緩存。
主線程依據(jù)上下游依賴關(guān)系去數(shù)據(jù)庫中定時檢查數(shù)據(jù)的結(jié)果,當所有分支都運行完成或運行失敗后,得出算法的總體結(jié)果。
為提高更新效率,上一輪檢查過后,已經(jīng)完成的任務(wù)記錄已查閱標記,下一輪檢查從未查閱結(jié)點開始檢查。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/65218.html
摘要:是一個任務(wù)日程管理系統(tǒng),一個在預(yù)先確定被納入日程的時間到達時,負責執(zhí)行或者通知其他軟件組件的系統(tǒng)。核心接口核心調(diào)度器任務(wù)任務(wù)描述觸發(fā)器和是同時相互依賴存在的,和觸發(fā)器一起注冊到核心調(diào)度器。 一、Quartz簡介 1. Quartz Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個開源項目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨使用。Q...
摘要:例如在周上設(shè)置表示周一三五觸發(fā)用于遞增觸發(fā)。例如在周上設(shè)置,表示本月的最后一個星期五表示離指定日期最近那個工作日周一至周五,例如在日字段上設(shè)置,表示離每月號最近的那個工作日觸發(fā)。相關(guān)例子代碼較簡單的定時任務(wù)調(diào)度工具利用集成 筆記來源:IMOOC Java Quartz Quartz 簡介 OpenSymphony 提供的強大的開源任務(wù)調(diào)度框架 純 Java 實現(xiàn),精細控制排程 Q...
摘要:時間年月日星期一說明本文部分內(nèi)容均來自慕課網(wǎng)。屬性任務(wù)名稱任務(wù)所屬組任務(wù)實現(xiàn)類傳參的作用淺談上是什么當調(diào)用一個,就會將傳遞給的方法能通過對象訪問到運行時候的環(huán)境以及本身的明細數(shù)據(jù)。 時間:2017年06月26日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼...
摘要:定時任務(wù)間隔時間方式執(zhí)行一次定時任務(wù)線程休眠規(guī)定時間類類允許調(diào)度一個任務(wù)。引入依賴配置測試執(zhí)行一次定時任務(wù)使用注解是為定時任務(wù)而生的一個注解,查看注解的源碼表達式接收一個。 本文旨在用通俗的語言講述枯燥的知識 定時任務(wù)作為一種系統(tǒng)調(diào)度工具,在一些需要有定時作業(yè)的系統(tǒng)中應(yīng)用廣泛,如每逢某個時間點統(tǒng)計數(shù)據(jù)、在將來某個時刻執(zhí)行某些動作...定時任務(wù)在主流開發(fā)語言均提供相應(yīng)的API供開發(fā)者調(diào)用...
摘要:注意當使用注解時,為了避免并發(fā)時,存儲數(shù)據(jù)造成混亂,強烈建議把注解也加上。示例假設(shè)定時任務(wù)的時間間隔為秒,但執(zhí)行時間是秒。當設(shè)置以后程序會等任務(wù)執(zhí)行完畢后再去執(zhí)行,否則會在秒時再啟動新的線程執(zhí)行。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009128328 1. 禁止同一個 JobDetail 中的多個實例并發(fā)...
閱讀 960·2021-10-09 09:58
閱讀 792·2021-08-27 16:24
閱讀 1869·2019-08-30 14:15
閱讀 2520·2019-08-30 11:04
閱讀 2246·2019-08-29 18:43
閱讀 2307·2019-08-29 15:20
閱讀 2867·2019-08-26 12:20
閱讀 1782·2019-08-26 11:44