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