我正在使用Quartz开发一个项目,并且一直存在与作业相关的问题。
我们有一个设置,其中A和B不依赖于彼此,但C是:
A和B可以同时运行,但C只能在A和B都完成时运行。
有没有办法在Quartz中设置这种场景,这样C只会在A和B结束时触发?
答案 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将提供一种更清晰的方法来实现这一目标,但是 在那之前,你必须使用上述方法之一,或者思考 另一个对你有用的。