Quartz Jobs依赖

时间:2013-01-15 16:38:24

标签: quartz-scheduler

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

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

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

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

1 个答案:

答案 0 :(得分:5)

我认为这是目前的做法: http://www.quartz-scheduler.org/documentation/faq#FAQ-chain

根据此常见问题解答,您可以创建一个等待A和B完成的作业监听器,然后在发生这种情况后安排作业C.

PS:以下是链接更改时的文字:

如何链接作业执行?或者,我如何创建工作流程?

目前没有使用Quartz链接触发器的“直接”或“免费”方式。但是,有几种方法可以毫不费力地完成它。以下是几种方法的概述:

一种方法是使用一个侦听器(即TriggerListener,JobListener或SchedulerListener),它可以注意到作业/触发器的完成,然后立即安排新触发器触发。这种方法可能会涉及到一些问题,因为您必须告知监听器哪个作业遵循哪个 - 您可能需要担心此信息的持久性。请参阅随Quartz一起提供的监听器org.quartz.listeners.JobChainingJobListener - 因为它已具有部分功能。

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

将来,Quartz将提供一种更清晰的方式来实现这一目标,但在此之前,您将不得不使用上述方法之一,或者想到另一种方法更适合您。