资讯专栏INFORMATION COLUMN

用Quartz实现工作流

Apollo / 3144人阅读

摘要:也有,触发点和相关,和我们的需求关系不大,暂忽略。实现为每个算法任务创建一个,任务失败不能启动后续任务,所以在运行失败的情况下,需要把启动的删除掉。需要自己在中实现多个依赖是否完成的检查。后续主线程的任务就是检查工作流是否已经完成。

Quartz简介

作为一个优秀的开源调度框架,Quartz 具有以下特点:
强大的调度功能,支持立即调度、定时调度、周期调度、并发调度;
灵活的应用方式,支持job间通过listener实现依赖调度,可以方便的进行调度组合,支持调度数据的多种存储方式;
分布式和集群能力;
作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

需求

对于工作流需要满足以下需求:
支持任务按照顺序进行调度(这是工作流的基本需求)
存在多任务并发调度的情况
存在某一个任务等待多个上游任务都结束才启动调度的情况
任务失败后,依赖该任务的下游结点要停止运行

Quartz的主要组件

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()就可以启动整个调度。
后续主线程的任务就是检查工作流是否已经完成。每个任务结点在任务完成后,会将当前任务结点的的运行结果写入数据库或缓存。
主线程依据上下游依赖关系去数据库中定时检查数据的结果,当所有分支都运行完成或运行失败后,得出算法的总体结果。
为提高更新效率,上一轮检查过后,已经完成的任务记录已查阅标记,下一轮检查从未查阅结点开始检查。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65218.html

相关文章

  • Quartz初级教程

    摘要:是一个任务日程管理系统,一个在预先确定被纳入日程的时间到达时,负责执行或者通知其他软件组件的系统。核心接口核心调度器任务任务描述触发器和是同时相互依赖存在的,和触发器一起注册到核心调度器。 一、Quartz简介 1. Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Q...

    lncwwn 评论0 收藏0
  • 【Java定时任务调度工具】Quartz

    摘要:例如在周上设置表示周一三五触发用于递增触发。例如在周上设置,表示本月的最后一个星期五表示离指定日期最近那个工作日周一至周五,例如在日字段上设置,表示离每月号最近的那个工作日触发。相关例子代码较简单的定时任务调度工具利用集成 笔记来源:IMOOC Java Quartz Quartz 简介 OpenSymphony 提供的强大的开源任务调度框架 纯 Java 实现,精细控制排程 Q...

    Render 评论0 收藏0
  • 慕课网_《Java定时任务调度工具详解之Quartz篇》学习总结

    摘要:时间年月日星期一说明本文部分内容均来自慕课网。属性任务名称任务所属组任务实现类传参的作用浅谈上是什么当调用一个,就会将传递给的方法能通过对象访问到运行时候的环境以及本身的明细数据。 时间:2017年06月26日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码...

    hiYoHoo 评论0 收藏0
  • SpringBoot下使定时任务的方式全揭秘

    摘要:定时任务间隔时间方式执行一次定时任务线程休眠规定时间类类允许调度一个任务。引入依赖配置测试执行一次定时任务使用注解是为定时任务而生的一个注解,查看注解的源码表达式接收一个。 本文旨在用通俗的语言讲述枯燥的知识 定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的API供开发者调用...

    DevTTL 评论0 收藏0
  • Quartz 2 定时任务(二):多线程并发执行与数据共享

    摘要:注意当使用注解时,为了避免并发时,存储数据造成混乱,强烈建议把注解也加上。示例假设定时任务的时间间隔为秒,但执行时间是秒。当设置以后程序会等任务执行完毕后再去执行,否则会在秒时再启动新的线程执行。 版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009128328 1. 禁止同一个 JobDetail 中的多个实例并发...

    OpenDigg 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<