【问题标题】:Quartz.net scheduler and IStatefulJobQuartz.net 调度器和 IStatefulJob
【发布时间】:2011-05-16 04:27:04
【问题描述】:

我想知道我是否理解正确。

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

IStatefulJob 实例稍稍跟随 与常规 IJob 不同的规则 实例。关键的区别在于 他们关联的 JobDataMap 是 每次执行后重新持久化 作业,从而为 下一次执行。另一个区别 是不允许有状态的工作吗 并发执行,这意味着 之前发生的新触发器 IJob.Execute 方法的完成 会延迟。

这是否意味着所有触发器都将延迟到另一个触发器完成?如果是这样,我该如何做到这一点,以便在前一个触发器完成之前只有相同的触发器不会触发。

假设我有每分钟触发一次的触发器 A,但由于某种原因它很慢并且需要一分半钟才能执行。如果我只使用计划 IJob,下一个会触发,我不想要这个。我想阻止触发器 A 再次触发,直到它完成。

但同时我也有每分钟触发一次的触发器 B。它以正常速度运行,每分钟准时完成。我不希望触发器 B 因为触发器 A 而被搁置。

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

【问题讨论】:

    标签: quartz-scheduler quartz.net


    【解决方案1】:

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

    如果触发器因此而错过其触发时间,则失火指令将发挥作用。由于先前的调用仍在运行而错过下一次触发的触发器根据其 misfire 指令决定要做什么(请参阅 API 和教程)。

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

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

    【讨论】:

    • @Marko Lahma- 所以你说即使我使用 IJob 只有一个同名的 IJob 会触发?
    • 不,这仅适用于 IStatefulJob。我稍微编辑了答案,希望让它更清楚一点。
    • @Marko Lahma - 他们都默认属于同一个组吗?我只是给了他们没有工作组名称的工作名称。
    • 是的,它们默认属于同一个组。可以浏览源码@fisheye3.atlassian.com/browse/quartznet。它即将推出 2.0,但基本行为是相同的。
    • @Marko Lahma - 所以如果我将它们更改为拥有自己的所有组问题应该得到解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多