在Quartz.NET/Quartz中发生了什么

时间:2010-10-22 09:35:59

标签: .net quartz-scheduler quartz.net

...当作业在下一次执行时间时仍在执行时?

例如,如果我的作业每30秒发生一次,并且在30秒之后它仍在运行,那么下一个实例会发挥作用还是会等待?

2 个答案:

答案 0 :(得分:2)

简短的回答是,除非您继承IStatefulJob,否则将执行新作业,在这种情况下,一次只允许运行一个作业实例。

答案 1 :(得分:2)

正如TskTsk回答的那样,你可以实现IJob的IStatefulJob,但是有一个问题!如果你的工作执行时间超过30秒(因此你有一个或多个工作等待这个工作完成),在执行之后所有正在等待的工作将会无意中发生!要解决这个问题,您需要创建实现SimpleTrigger的新类。这个新的触发器类应该覆盖GetFireTimeAfter。

public class MyTrigger : SimpleTrigger
{

    public MyTrigger(string name,
                     string group,
                     DateTime startTimeUtc,
                     DateTime? endTimeUtc,
                     int repeatCount,
                     TimeSpan repeatInterval) : base(name, startTimeUtc, endTimeUtc, repeatCount, repeatInterval)
    {
    }

    public override DateTime? GetFireTimeAfter(DateTime? afterTimeUtc)
    {
        return DateTime.UtcNow.AddSeconds(RepeatInterval.TotalSeconds);
    }

}

这样,下一个作业将在第一个作业完成后不会立即执行。