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

San*_*hit 13 java scheduling quartz-scheduler

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

Vis*_*hal 13

目前没有"直接"或"免费"的方式来链接触发器与Quartz.但是,有几种方法可以毫不费力地完成它.以下是几种方法的概述:

一种方法是使用一个侦听器(即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


Jan*_*vec 5

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

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

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

QuartzDesk GUI:编辑工作链目标