我想知道我是否理解这一点。
http://quartznet.sourceforge.net/apidoc/
IStatefulJob实例略有关注 与常规IJob不同的规则 实例。关键的区别在于 他们关联的JobDataMap是 每次执行后都会重新坚持下去 这项工作,因此保留了国家 下次执行。另一个区别 是不允许有状态的工作 同时执行,这意味着 在之前发生的新触发器 完成IJob.Execute方法 将被推迟。
这是否意味着所有触发器都会延迟,直到另一个触发器完成?如果是这样,我怎么能这样做只有相同的触发器才会触发,直到完成上一次触发。
假设我有触发器A每分钟触发一次,但由于某种原因它很慢并需要一分半钟来执行。如果我只是使用一个计划IJob,那么下一个会发射,我不想要这个。我想暂停触发器A再次触发,直到完成为止。
然而,与此同时,我触发B也会每分钟发射一次。它正常速度,每分钟准时完成。由于触发器A,我不希望触发器B被抬起。
根据我的理解,如果我使用IStatefulJob会发生这种情况。
答案 0 :(得分:3)
简而言之......这种行为来自工作方。因此,无论有多少触发器,您可能只有一次运行的给定IStatefulJob(作业名称,作业组指示实例ID)的单个实例。因此,如果作业实现了IStatefulJob,则可能存在两个相同作业类型的实例,但没有同名作业(名称,组)。
如果由于此触发器错过了发射时间,则失火指令开始起作用。由于早期调用仍在运行,因此错过了下一次触发的触发器根据其失火指令决定要执行的操作(请参阅API和教程)。
对于普通的IJob,如果您有多个触发器和/或发生失火,您无法保证同时运行多少个作业。 IJob只是调用作业的合约界面。 Quartz.NET 2.0将IStatefulJob组合行为拆分为两个独立的属性:DisallowConcurrentExecution和PersistJobDataAfterExecution。
因此,您可以将相同的作业类型(IStatefulJobs)与两个定义(不同的作业名称)和触发器结合使用适用的失火指令。