我正在使用 Quartz 进行一个项目,并且一直存在与作业的依赖关系的问题。
我们有一个设置,其中 A 和 B 不相互依赖,尽管 C 是:
A 和 B 可以同时运行,但 C 只能在 A 和 B 都完成时运行。
有没有办法在 Quartz 中设置这种场景,这样 C 只会在 A 和 B 完成时触发?
我正在使用 Quartz 进行一个项目,并且一直存在与作业的依赖关系的问题。
我们有一个设置,其中 A 和 B 不相互依赖,尽管 C 是:
A 和 B 可以同时运行,但 C 只能在 A 和 B 都完成时运行。
有没有办法在 Quartz 中设置这种场景,这样 C 只会在 A 和 B 完成时触发?
不是直接 AFAIK,但使用TriggerListener来实现这样的功能应该不会太难(TriggerListener 在作业的开始和结束时运行,您可以为单个触发器或触发器组设置它们)。
编辑:甚至有一个关于这个问题的特定常见问题解答主题:
目前没有“直接”或“免费”的方式来使用 Quartz 链接触发器。但是,您可以通过多种方式轻松完成它。以下是几种方法的概述:
一种方法是使用一个监听器(即 TriggerListener、JobListener 或 SchedulerListener),它可以注意到作业/触发器的完成,然后立即安排新的触发器触发。这种方法可能会涉及一些问题,因为您必须通知侦听器执行哪个作业 - 您可能需要担心此信息的持久性。请参阅 Quartz 附带的侦听器 org.quartz.listeners.JobChainingJobListener - 因为它已经具有一些此功能。
另一种方法是构建一个 Job,在其 JobDataMap 中包含要触发的下一个作业的名称,并在作业完成时(其 execute() 方法的最后一步)让作业调度下一个作业。有几个人正在这样做,并且运气不错。大多数人已经创建了一个基本(抽象)类,它是一个 Job,它知道如何使用预定义的键(常量)从 JobDataMap 中获取作业名称和组,并包含用于安排已识别作业的代码。这个抽象 Job 的 execute() 实现委托给一个抽象模板方法,例如“doWork()”(扩展 Job 类的实际工作所在),然后它包含用于调度后续作业的代码。然后他们简单地扩展这个类,包括工作应该做的工作。使用“持久”工作,
将来,Quartz 将提供一种更简洁的方法来执行此操作,但在此之前,您必须使用上述方法之一,或者考虑另一种更适合您的方法。