我正在使用Quartz Scheduling,有2个工作。第一个作业执行约2分钟的任务,第二个作业是为临时文件的清洁操作设置。因此,我需要设置计划,以便在第一个作业执行/完成执行任务后,我需要在第二个作业的帮助下执行清理操作。
考虑示例9 - Quartz 2.1.x下的Job Listeners,它声明我们可以定义一个名为jobWasExecuted(_,_)的方法;在Job Listener中,它在第一个作业执行/或进入运行状态时执行。
我们是否能够设置可以监听第一个作业然后执行第二个作业的计划?要么,
我们是否能够像在Java多线程中那样定义join()方法,它可以在完成第一个作业时执行?
答案 0 :(得分:13)
目前没有“直接”或“免费”的方式来链接触发器 石英。但是,有几种方法可以在没有它的情况下完成它 努力。以下是几种方法的概述:
一种方法是使用监听器(即TriggerListener,JobListener或 SchedulerListener),可以注意到作业/触发器的完成情况 然后立即安排一个新的触发器来触发。这种方法可以得到 有点参与,因为你必须通知听众哪个工作 遵循哪个 - 你可能需要担心这种情况的持久性 信息。
另一种方法是构建一个Job,它在JobDataMap中包含要触发的下一个作业的名称,并且当作业完成时(其Execute()方法的最后一步)让作业计划下一个作业。有几个人这样做,并且运气好。大多数人都创建了一个基类(抽象)类,它是一个知道如何使用特殊键(常量)从JobDataMap中获取作业名称和组的Job,并包含用于调度已识别作业的代码。然后 他们只是扩展了这个包含附加内容的类 工作应该做的工作。
答案 1 :(得分:5)
我知道这是一个老问题,但是还有2个选项可用于连接你的工作执行,人们会发现这些工作很有用:
1)使用自早期版本发布以来标准Quartz发行版中包含的JobChainingJobListener。此侦听器允许您使用其 addJobChainLink 方法以编程方式定义简单作业链。
2)使用QuartzDesk等商业解决方案,我是其主要开发者。 QuartzDesk包含一个强大的作业链引擎,允许您从应用程序代码外部化作业链的定义,并使您能够在运行时通过GUI更新作业链,而无需修改,重新部署和重新启动应用程序。作业链可以与特定作业,触发器相关联,也可以是任何作业执行时执行的全局作业链(对全局作业执行失败处理程序等有用)。
答案 2 :(得分:1)
如何同时禁止作业?
Quartz.NET 2.x
实施IJob并使用。修饰您的工作类 [DisallowConcurrentExecution]属性。阅读API文档 有关DisallowConcurrentExecutionAttribute的更多信息。
注释在Java实现中可用。