2013-07-18 102 views
3

我正在与Quartz一起工作,并且一直存在与作业相关的问题。石英调度器依赖作业

我们有一个设置,其中A和B是不依赖于海誓山盟,虽然C是:

A和B可以在同一时间运行,但是当A和B都是完整的C只能运行。

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

回答

3

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

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

当前有没有“直接”或“免费”的方式来链 石英触发。然而,有很多方法可以在不用 的情况下完成。下面是一对夫妇的轮廓接近:

的一种方法是使用监听器(即TriggerListener,JobListener或 SchedulerListener),可以发现一个工作/触发的完成和 然后立即安排新的触发火灾。这种方法可能会涉及到 ,因为您必须通知听众跟随哪个作业 - 您可能需要担心此 信息的持续存在。查看听众 org.quartz.listeners.JobChainingJobListener,随Quartz一起发货 - ,因为它已经具有一些此功能。

另一种方式是建立自己的JobDataMap内含有火下一个作业的 名称的作业,并为作业完成(最后一步 在其execute()方法)有工作安排接下来的工作。有几个人正在这样做,并有幸运。大多数基于 (抽象)类是一个Job,它知道如何使用预定义键(常量)从JobDataMap中获取作业名称和 组,并且 包含用于调度已标识作业的代码。此抽象Job的 执行execute()委托给抽象模板方法 ,如“doWork()”(其中扩展的Job类的实际工作) ,然后它包含用于安排后续工作的代码。然后 他们只是做这个类的扩展,包括 工作应该做的工作。 '持久'作业的使用,或重载的addJob(JobDetail,boolean,boolean)方法(在Quartz 2.2中添加)有助于 应用程序同时使用其正确的数据定义所有作业, 尚未创建触发器来触发它们(除了一次触发 解锁链中的第一份工作)。在未来,Quartz将提供一个更简洁的方式来做到这一点,但在此之前,您将不得不使用上述方法之一,或者认为 是另一个更适合您的方法。