5

我正在使用 Quartz 进行一个项目,并且一直存在与作业的依赖关系的问题。

我们有一个设置,其中 A 和 B 不相互依赖,尽管 C 是:

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

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

4

1 回答 1

7

我认为这是当前的方法: 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() 方法的最后一步)让作业调度下一个作业。有几个人正在这样做,并且运气不错。大多数人已经创建了一个基本(抽象)类,它是一个 Job,它知道如何使用预定义的键(常量)从 JobDataMap 中获取作业名称和组,并包含用于安排已识别作业的代码。这个抽象 Job 的 execute() 实现委托给一个抽象模板方法,例如“doWork()”(扩展 Job 类的实际工作所在),然后它包含用于调度后续作业的代码。然后他们简单地扩展这个类,包括工作应该做的工作。使用“持久”工作,

将来,Quartz 将提供一种更简洁的方法来执行此操作,但在此之前,您必须使用上述方法之一,或者考虑另一种更适合您的方法。

于 2013-12-14T22:11:29.180 回答