quartz-scheduler依赖于工作

时间:2013-07-18 11:23:58

标签: quartz-scheduler

我正在使用Quartz开发一个项目,并且一直存在与作业相关的问题。

我们有一个设置,其中A和B不依赖于彼此,但C是:

A和B可以同时运行,但C只能在A和B都完成时运行。

有没有办法在Quartz中设置这种场景,这样C只会在A和B结束时触发?

1 个答案:

答案 0 :(得分:3)

不是直接AFAIK,但是使用TriggerListener来实现这样的功能应该不会太难(TriggerListener既可以运行作业的开始也可以结束,并且您可以为单个触发器设置它们或者触发组)。

编辑:关于这个问题甚至有一个特定的FAQ Topic

  

目前没有“直接”或“免费”的方式来链接触发器   石英。但是,有几种方法可以在没有它的情况下完成它   努力。以下是几种方法的概述:

     

一种方法是使用监听器(即TriggerListener,JobListener或   SchedulerListener),可以注意到作业/触发器的完成情况   然后立即安排一个新的触发器来触发。这种方法可以得到   有点参与,因为你必须通知听众哪个工作   遵循哪个 - 你可能需要担心这种情况的持久性   信息。看听众   Quartz附带的org.quartz.listeners.JobChainingJobListener -   因为它已经具备了一些这样的功能。

     

另一种方法是构建一个包含在JobDataMap中的Job   要触发的下一个作业的名称,以及作业完成时(最后一步)   在其execute()方法中)将作业计划下一个作业。一些   人们这样做并且运气好。大多数人已经建立了基地   (抽象)类,它是一个知道如何获取作业名称的作业   使用预定义的键(常量)和来分组JobDataMap   包含用于安排已识别作业的代码。这个抽象的工作   execute()的实现委托给抽象模板方法   例如“doWork()”(扩展Job类的实际工作)   然后它包含用于安排后续工作的代码。然后   他们只是扩展了这个包括工作的类   工作应该做。使用'持久'作业,或过载   addJob(JobDetail,boolean,boolean)方法(在Quartz 2.2中添加)有帮助   应用程序使用适当的数据一次定义所有作业,   尚未创建触发器来触发它们(除了一个触发器之外)   解雇链中的第一份工作。)

     

将来,Quartz将提供一种更清晰的方法来实现这一目标,但是   在那之前,你必须使用上述方法之一,或者思考   另一个对你有用的。