如何做“顺序”作业调度(Quartz?)

时间:2012-11-21 04:58:10

标签: java scheduling quartz-scheduler

我正在使用Quartz Scheduling,有2个工作。第一个作业执行约2分钟的任务,第二个作业是为临时文件的清洁操作设置。因此,我需要设置计划,以便在第一个作业执行/完成执行任务后,我需要在第二个作业的帮助下执行清理操作。
考虑示例9 - Quartz 2.1.x下的Job Listeners,它声明我们可以定义一个名为jobWasExecuted(_,_)的方法;在Job Listener中,它在第一个作业执行/或进入运行状态时执行。
我们是否能够设置可以监听第一个作业然后执行第二个作业的计划?要么,
我们是否能够像在Java多线程中那样定义join()方法,它可以在完成第一个作业时执行?

3 个答案:

答案 0 :(得分:13)

  

目前没有“直接”或“免费”的方式来链接触发器   石英。但是,有几种方法可以在没有它的情况下完成它   努力。以下是几种方法的概述:

     

一种方法是使用监听器(即TriggerListener,JobListener或   SchedulerListener),可以注意到作业/触发器的完成情况   然后立即安排一个新的触发器来触发。这种方法可以得到   有点参与,因为你必须通知听众哪个工作   遵循哪个 - 你可能需要担心这种情况的持久性   信息。

     

另一种方法是构建一个Job,它在JobDataMap中包含要触发的下一个作业的名称,并且当作业完成时(其Execute()方法的最后一步)让作业计划下一个作业。有几个人这样做,并且运气好。大多数人都创建了一个基类(抽象)类,它是一个知道如何使用特殊键(常量)从JobDataMap中获取作业名称和组的Job,并包含用于调度已识别作业的代码。然后   他们只是扩展了这个包含附加内容的类   工作应该做的工作。

参考:http://www.quartz-scheduler.net/documentation/faq.html#how-do-i-chain-job-execution?-or,-how-do-i-create-a-workflow

答案 1 :(得分:5)

我知道这是一个老问题,但是还有2个选项可用于连接你的工作执行,人们会发现这些工作很有用:

1)使用自早期版本发布以来标准Quartz发行版中包含的JobChainingJobListener。此侦听器允许您使用其 addJobChainLink 方法以编程方式定义简单作业链。

2)使用QuartzDesk等商业解决方案,我是其主要开发者。 QuartzDesk包含一个强大的作业链引擎,允许您从应用程序代码外部化作业链的定义,并使您能够在运行时通过GUI更新作业链,而无需修改,重新部署和重新启动应用程序。作业链可以与特定作业,触发器相关联,也可以是任何作业执行时执行的全局作业链(对全局作业执行失败处理程序等有用)。

QuartzDesk GUI: Editing a job chain target

答案 2 :(得分:1)

来自http://www.quartz-scheduler.net/documentation/faq.html#how-do-i-chain-job-execution?-or,-how-do-i-create-a-workflow

  

如何同时禁止作业?

     

Quartz.NET 2.x

     

实施IJob并使用。修饰您的工作类   [DisallowConcurrentExecution]属性。阅读API文档   有关DisallowConcurrentExecutionAttribute的更多信息。

注释在Java实现中可用。