如何防止quartz作业多重运行

Ole*_*kin 5 quartz.net

我正在使用quartz.net 2.3 作业标记有 DisallowConcurrentExecution 属性。当 TriggerJob 手动启动作业时,如果作业已经在进行中,则不会启动,这是正常的。但当之前的执行完成后,它会立即重新开始。如果在作业正在进行时被解雇,是否可以阻止将来的执行?

Nic*_*ris 3

是的。您可以检索该作业的所有触发器,将它们与正在执行的触发器进行比较,如果它们被安排在该作业之后,则取消安排该作业(触发器将被删除)。

所以,从你的工作来看:

public void Execute(IJobExecutionContext context)
{
    var currentlyExecutingTrigger = context.Trigger;
    var currentlyExecutingJobkey = context.JobDetail.Key;

    var newTriggers = context.Scheduler.GetTriggersOfJob(key);

    //if trigger was scheduled after currently executing trigger
    foreach (var newTrigger in newTriggers)
    {
        if (newTrigger.StartTimeUtc >= trigger.StartTimeUtc)
        {
            //delete it
            context.Scheduler.UnscheduleJob(newTrigger.Key);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)