Quartz.net调度程序和IStatefulJob

时间:2011-05-16 04:27:05

标签: quartz-scheduler quartz.net

我想知道我是否理解这一点。

http://quartznet.sourceforge.net/apidoc/

  

IStatefulJob实例略有关注   与常规IJob不同的规则   实例。关键的区别在于   他们关联的JobDataMap是   每次执行后都会重新坚持下去   这项工作,因此保留了国家   下次执行。另一个区别   是不允许有状态的工作   同时执行,这意味着   在之前发生的新触发器   完成IJob.Execute方法   将被推迟。

这是否意味着所有触发器都会延迟,直到另一个触发器完成?如果是这样,我怎么能这样做只有相同的触发器才会触发,直到完成上一次触发。

假设我有触发器A每分钟触发一次,但由于某种原因它很慢并需要一分半钟来执行。如果我只是使用一个计划IJob,那么下一个会发射,我不想要这个。我想暂停触发器A再次触发,直到完成为止。

然而,与此同时,我触发B也会每分钟发射一次。它正常速度,每分钟准时完成。由于触发器A,我不希望触发器B被抬起。

根据我的理解,如果我使用IStatefulJob会发生这种情况。

1 个答案:

答案 0 :(得分:3)

简而言之......这种行为来自工作方。因此,无论有多少触发器,您可能只有一次运行的给定IStatefulJob(作业名称,作业组指示实例ID)的单个实例。因此,如果作业实现了IStatefulJob,则可能存在两个相同作业类型的实例,但没有同名作业(名称,组)。

如果由于此触发器错过了发射时间,则失火指令开始起作用。由于早期调用仍在运行,因此错过了下一次触发的触发器根据其失火指令决定要执行的操作(请参阅API和教程)。

对于普通的IJob,如果您有多个触发器和/或发生失火,您无法保证同时运行多少个作业。 IJob只是调用作业的合约界面。 Quartz.NET 2.0将IStatefulJob组合行为拆分为两个独立的属性:DisallowConcurrentExecution和PersistJobDataAfterExecution。

因此,您可以将相同的作业类型(IStatefulJobs)与两个定义(不同的作业名称)和触发器结合使用适用的失火指令。