【问题标题】:Quartz.NET 2.6.1: Multiple Triggers for same Job trigger at same time, but need only one trigger to occurQuartz.NET 2.6.1:多个触发器同时触发同一个作业,但只需要一个触发器发生
【发布时间】:2017-11-21 11:05:53
【问题描述】:

我有多个触发器工作。在某些情况下,触发器会重叠。当 Quartz.NET 确定需要触发重叠的 Trigger 时,会为每个 Trigger 执行IJob.Execute(IJobExecutionContext context) 方法。

有没有办法防止这种重叠?

提前致谢。

【问题讨论】:

  • 在作业实现中使用[DisallowConcurrentExecution]属性
  • @Najera 感谢您的回复。我已经尝试过了,但这一切都是为了防止触发的作业实例同时运行。如果我有三个同时触发的触发器,那么您提到的属性会强制作业按顺序运行三次。
  • 那是不同的需求,这需要多久运行一次?
  • 它总是需要运行一次;无论该作业触发了多少触发器。

标签: quartz.net quartz.net-2.0


【解决方案1】:

我还没有测试过,但我会给它一个机会:

[DisallowConcurrentExecution]
public class Job : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        bool wasExecutedAt = WasExecutedAt(context.ScheduledFireTimeUtc);
    }

    private bool WasExecutedAt(DateTimeOffset? fireTime)
    {
         // Check and maintain the state
    }
}

【讨论】:

  • 这似乎奏效了。谢谢纳杰拉!对于看到这篇文章的其他人,我坚持使用“context.JobDetail.JobDataMap”对象,并针对该类添加了 [PersistJobDataAfterExecution] 属性。
  • 理论上,@Najera,你的代码没问题。不幸的是,Quartz.NET 中存在一个错误(似乎至少从 2016 年开始出现),其中“ScheduledFireTimeUtc”实际上设置为“FireTimeUtc”。您是否碰巧知道是否有办法在实际触发时获得计划触发时间的正确值? github上报告的错误是:github.com/quartznet/quartznet/issues/605
  • 我重构创建了一个实现 IJob 的基类,并将 DisallowConcurrentExecution 和 PersistJobDataAfterExecution 属性放到基类上。我不得不移动属性并将它们放在我所有的派生类中,以使其重新开始工作。这是一种耻辱,因为我的基类中的代码(基于@Najera 示例)如果没有这些属性就毫无用处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多