成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用Quartz實(shí)現(xiàn)工作流

Apollo / 3263人閱讀

摘要:也有,觸發(fā)點(diǎn)和相關(guān),和我們的需求關(guān)系不大,暫忽略。實(shí)現(xiàn)為每個(gè)算法任務(wù)創(chuàng)建一個(gè),任務(wù)失敗不能啟動(dòng)后續(xù)任務(wù),所以在運(yùn)行失敗的情況下,需要把啟動(dòng)的刪除掉。需要自己在中實(shí)現(xiàn)多個(gè)依賴是否完成的檢查。后續(xù)主線程的任務(wù)就是檢查工作流是否已經(jīng)完成。

Quartz簡(jiǎn)介

作為一個(gè)優(yōu)秀的開源調(diào)度框架,Quartz 具有以下特點(diǎn):
強(qiáng)大的調(diào)度功能,支持立即調(diào)度、定時(shí)調(diào)度、周期調(diào)度、并發(fā)調(diào)度;
靈活的應(yīng)用方式,支持job間通過(guò)listener實(shí)現(xiàn)依賴調(diào)度,可以方便的進(jìn)行調(diào)度組合,支持調(diào)度數(shù)據(jù)的多種存儲(chǔ)方式;
分布式和集群能力;
作為 Spring 默認(rèn)的調(diào)度框架,Quartz 很容易與 Spring 集成實(shí)現(xiàn)靈活可配置的調(diào)度功能。

需求

對(duì)于工作流需要滿足以下需求:
支持任務(wù)按照順序進(jìn)行調(diào)度(這是工作流的基本需求)
存在多任務(wù)并發(fā)調(diào)度的情況
存在某一個(gè)任務(wù)等待多個(gè)上游任務(wù)都結(jié)束才啟動(dòng)調(diào)度的情況
任務(wù)失敗后,依賴該任務(wù)的下游結(jié)點(diǎn)要停止運(yùn)行

Quartz的主要組件

Quartz的主要組件如下圖所示,任務(wù)調(diào)度三個(gè)主要的類是 Scheduler、Trigger、Job。
Scheduler 是執(zhí)行調(diào)度的控制器。
Trigger 是用于定義調(diào)度時(shí)間的元素,我們項(xiàng)目沒有定時(shí)調(diào)度的需求,所有調(diào)度都選用理解觸發(fā)就可以了。
Job 表示被調(diào)度的任務(wù),Job和Trigger成對(duì)傳遞給Scheduler,當(dāng)Trigger的條件滿足時(shí),它對(duì)應(yīng)的Job就會(huì)被Scheduler觸發(fā)。

Trigger/Job的組合不能實(shí)現(xiàn)順序調(diào)度,實(shí)現(xiàn)順序調(diào)度需要用到JobListener,JobListener對(duì)指定Job進(jìn)行監(jiān)聽,如上圖所示,JobLisener可以捕捉到三個(gè)任務(wù)觸發(fā)點(diǎn).
我們需要的是在Job已執(zhí)行完成這個(gè)觸發(fā)點(diǎn),把下一個(gè)Job啟動(dòng)起來(lái)。
也有TriggerLisener/SchedulerLisener,觸發(fā)點(diǎn)和Trigger、Scheduler相關(guān),和我們的需求關(guān)系不大,暫忽略。

實(shí)現(xiàn)

為每個(gè)算法任務(wù)創(chuàng)建一個(gè)Job,任務(wù)失敗不能啟動(dòng)后續(xù)任務(wù),所以在job運(yùn)行失敗的情況下,需要把啟動(dòng)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");
       }  
  
       /* 當(dāng)前任務(wù)結(jié)果寫入數(shù)據(jù)庫(kù) */
    }
}

基于所有的依賴關(guān)系,創(chuàng)建JobLisener,并將JobLisener與它依賴的Job綁定,在JobLisener中將下一步的Job啟動(dòng)起來(lái)。

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 {
            /* 拉起下一個(gè)Job */
            inContext.getScheduler().scheduleJob(nextJob, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

當(dāng)前任務(wù)依賴多個(gè)上游Job時(shí),試驗(yàn)了AndMatcher,這個(gè)方法是對(duì)多個(gè)條件進(jìn)行判斷的接口,不能進(jìn)行多上游依賴判斷。
需要自己在JobLisener中實(shí)現(xiàn)多個(gè)依賴是否完成的檢查。JobLisener需要知道其它依賴的完成情況,并且在自己完成后更新自己的狀態(tài)。
所有Job、JobLisener的關(guān)系配置好以后,調(diào)用scheduler.start()就可以啟動(dòng)整個(gè)調(diào)度。
后續(xù)主線程的任務(wù)就是檢查工作流是否已經(jīng)完成。每個(gè)任務(wù)結(jié)點(diǎn)在任務(wù)完成后,會(huì)將當(dāng)前任務(wù)結(jié)點(diǎn)的的運(yùn)行結(jié)果寫入數(shù)據(jù)庫(kù)或緩存。
主線程依據(jù)上下游依賴關(guān)系去數(shù)據(jù)庫(kù)中定時(shí)檢查數(shù)據(jù)的結(jié)果,當(dāng)所有分支都運(yùn)行完成或運(yùn)行失敗后,得出算法的總體結(jié)果。
為提高更新效率,上一輪檢查過(guò)后,已經(jīng)完成的任務(wù)記錄已查閱標(biāo)記,下一輪檢查從未查閱結(jié)點(diǎn)開始檢查。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65218.html

相關(guān)文章

  • Quartz初級(jí)教程

    摘要:是一個(gè)任務(wù)日程管理系統(tǒng),一個(gè)在預(yù)先確定被納入日程的時(shí)間到達(dá)時(shí),負(fù)責(zé)執(zhí)行或者通知其他軟件組件的系統(tǒng)。核心接口核心調(diào)度器任務(wù)任務(wù)描述觸發(fā)器和是同時(shí)相互依賴存在的,和觸發(fā)器一起注冊(cè)到核心調(diào)度器。 一、Quartz簡(jiǎn)介 1. Quartz Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個(gè)開源項(xiàng)目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨(dú)使用。Q...

    lncwwn 評(píng)論0 收藏0
  • 【Java定時(shí)任務(wù)調(diào)度工具】Quartz

    摘要:例如在周上設(shè)置表示周一三五觸發(fā)用于遞增觸發(fā)。例如在周上設(shè)置,表示本月的最后一個(gè)星期五表示離指定日期最近那個(gè)工作日周一至周五,例如在日字段上設(shè)置,表示離每月號(hào)最近的那個(gè)工作日觸發(fā)。相關(guān)例子代碼較簡(jiǎn)單的定時(shí)任務(wù)調(diào)度工具利用集成 筆記來(lái)源:IMOOC Java Quartz Quartz 簡(jiǎn)介 OpenSymphony 提供的強(qiáng)大的開源任務(wù)調(diào)度框架 純 Java 實(shí)現(xiàn),精細(xì)控制排程 Q...

    Render 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Java定時(shí)任務(wù)調(diào)度工具詳解之Quartz篇》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期一說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。屬性任務(wù)名稱任務(wù)所屬組任務(wù)實(shí)現(xiàn)類傳參的作用淺談上是什么當(dāng)調(diào)用一個(gè),就會(huì)將傳遞給的方法能通過(guò)對(duì)象訪問(wèn)到運(yùn)行時(shí)候的環(huán)境以及本身的明細(xì)數(shù)據(jù)。 時(shí)間:2017年06月26日星期一說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼...

    hiYoHoo 評(píng)論0 收藏0
  • SpringBoot下使定時(shí)任務(wù)的方式全揭秘

    摘要:定時(shí)任務(wù)間隔時(shí)間方式執(zhí)行一次定時(shí)任務(wù)線程休眠規(guī)定時(shí)間類類允許調(diào)度一個(gè)任務(wù)。引入依賴配置測(cè)試執(zhí)行一次定時(shí)任務(wù)使用注解是為定時(shí)任務(wù)而生的一個(gè)注解,查看注解的源碼表達(dá)式接收一個(gè)。 本文旨在用通俗的語(yǔ)言講述枯燥的知識(shí) 定時(shí)任務(wù)作為一種系統(tǒng)調(diào)度工具,在一些需要有定時(shí)作業(yè)的系統(tǒng)中應(yīng)用廣泛,如每逢某個(gè)時(shí)間點(diǎn)統(tǒng)計(jì)數(shù)據(jù)、在將來(lái)某個(gè)時(shí)刻執(zhí)行某些動(dòng)作...定時(shí)任務(wù)在主流開發(fā)語(yǔ)言均提供相應(yīng)的API供開發(fā)者調(diào)用...

    DevTTL 評(píng)論0 收藏0
  • Quartz 2 定時(shí)任務(wù)(二):多線程并發(fā)執(zhí)行與數(shù)據(jù)共享

    摘要:注意當(dāng)使用注解時(shí),為了避免并發(fā)時(shí),存儲(chǔ)數(shù)據(jù)造成混亂,強(qiáng)烈建議把注解也加上。示例假設(shè)定時(shí)任務(wù)的時(shí)間間隔為秒,但執(zhí)行時(shí)間是秒。當(dāng)設(shè)置以后程序會(huì)等任務(wù)執(zhí)行完畢后再去執(zhí)行,否則會(huì)在秒時(shí)再啟動(dòng)新的線程執(zhí)行。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000009128328 1. 禁止同一個(gè) JobDetail 中的多個(gè)實(shí)例并發(fā)...

    OpenDigg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<