防止触发器同时被触发

时间:2015-01-15 08:19:36

标签: c# quartz.net job-scheduling

有没有办法告诉Quartz.NET不要同时触发两个触发器?这意味着如果触发器A和触发器B具有完全相同的时间表,那么触发器B会等待一段时间然后触发?

我在我的程序中看到,当我的作业从同一个文件读取并执行相同的.exe文件时,这可能会导致问题。这导致了一个未被捕获的异常,我还没弄清楚。

我不确定Quartz.NET如何处理这个问题。但有没有办法延迟这样的触发器(即使只是几秒钟)?

1 个答案:

答案 0 :(得分:1)

您可以使用DisallowConcurrentExecutionAttribute来完成工作。

[DisallowConcurrentExecutionAttribute]
class DisallowConcurrentJob : IJob
{
   //Implementation goes here
}
  

它可以防止多个具有相同密钥的作业实例运行   在同一时间。

可以找到一个非常好的解释here

<强>更新

如果您想确保触发器/作业始终运行,您可以使用misfire说明:

IJobDetail job1 = JobBuilder.Create<InheritedJob1>()
    .WithIdentity("DisallowConcurrentJob", "MYGROUP")
    .RequestRecovery(true)
    .Build();

//Schedule this job to execute every second, a maximum of 5 times
ITrigger trigger1 = TriggerBuilder.Create()
    .WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForTotalCount(5)
        .WithMisfireHandlingInstructionFireNow())
    .StartNow()
    .WithIdentity("DisallowConcurrentJobTrigger", "MYGROUP")
    .Build();

Scheduler.ScheduleJob(job1, trigger1);

<强> WithMisfireHandlingInstructionFireNow

The job is executed immediately after the scheduler discovers misfire situation.