我正在使用 Quartz Scheduling 并且有 2 个工作。第一个作业执行任务大约 2 分钟,第二个作业是为临时文件的清理操作设置。因此,我需要设置计划以在第一个作业执行/完成执行任务后我需要在第二个作业的帮助下进行清洁操作。
考虑示例 9 - Quartz 2.1.x 下的作业监听器,它指出我们可以定义一个名为 jobWasExecuted(_, _); 的方法;在作业侦听器中,它在第一个作业执行/或进入运行状态时执行。
我们是否能够设置可以侦听第一个作业完成然后执行第二个作业的时间表?或者,
我们是否能够像 Java 多线程中那样定义可以在第一个作业完成时执行的 join() 方法?
3 回答
目前没有“直接”或“免费”的方式来使用 Quartz 链接触发器。但是,您可以通过多种方式轻松完成它。以下是几种方法的概述:
一种方法是使用一个监听器(即 TriggerListener、JobListener 或 SchedulerListener),它可以注意到作业/触发器的完成,然后立即安排新的触发器触发。这种方法可能会涉及一些问题,因为您必须通知侦听器执行哪个作业 - 您可能需要担心此信息的持久性。
另一种方法是构建一个 Job,在其 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 个选项可用于链接您的工作的执行,人们会发现它们很有用:
1) 使用从早期版本开始就包含在标准 Quartz 发行版中的JobChainingJobListener 。此侦听器允许您使用其addJobChainLink方法以编程方式定义简单的作业链。
2) 使用我是主要开发人员的商业解决方案,例如QuartzDesk 。QuartzDesk 包含一个强大的作业链引擎,它允许您将作业链的定义从应用程序代码外部化,并使您能够在运行时通过 GUI 更新作业链,而无需修改、重新部署和重新启动应用程序。作业链可以与特定的作业、触发器相关联,也可以是在任何作业执行时都会执行的全局作业链(对于全局作业执行失败处理程序等很有用)。
如何防止作业同时触发?
石英.NET 2.x
实现 IJob 并使用 [DisallowConcurrentExecution] 属性装饰您的作业类。阅读 DisallowConcurrentExecutionAttribute 的 API 文档以获取更多信息。
注解在 Java 实现中可用。