如何进行“顺序”作业调度(Quartz?

2022-09-03 05:58:53

我正在使用Quartz Scheduling,有2个工作。第一个作业执行任务约 2 分钟,第二个作业将设置为临时文件的清理操作。因此,我需要设置计划,以便在执行/完成第一个作业执行任务后,我需要在第二个作业的帮助下执行清理操作。
考虑 Quartz 2.1.x 下的示例 9 - Job Listeners,其中指出我们可以定义一个名为 jobWasExecuted( _, _ ) 的方法;在作业侦听器中,并在执行第一个作业/或处于运行状态时执行。
我们是否能够设置计划,该计划可以侦听第一个作业完成,然后执行第二个作业?或者,
我们是否能够像Java Multithreading中那样定义可以在第一个作业完成时执行的jom()方法?


答案 1

目前没有“直接”或“自由”的方式来用Quartz链动触发器。但是,有几种方法可以毫不费力地完成它。以下是几种方法的概述:

一种方法是使用侦听器(即 TriggerListener、JobListener 或 SchedulerListener),它可以注意到作业/触发器的完成,然后立即计划要触发的新触发器。这种方法可能会有点复杂,因为您必须告知听众哪个作业遵循哪个作业 - 并且您可能需要担心此信息的持久性。

另一种方法是构建一个作业,该作业在其 JobDataMap 中包含要触发的下一个作业的名称,并且随着作业的完成(其 Execute() 方法中的最后一步),作业将计划下一个作业。有几个人正在这样做,并且运气很好。大多数人都创建了一个基(抽象)类,该类是一个 Job,它知道如何使用特殊键(常量)从 JobDataMap 中获取作业名称和组,并包含用于计划已识别作业的代码。然后,他们只需对此类进行扩展,其中包括工作应执行的额外工作。

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


答案 2

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

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

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

QuartzDesk GUI: Editing a job chain target


推荐