...当一个作业在下一个执行时间发生时仍在执行时?
例如,如果我有一个工作每 30 秒发生一次,并且在 30 秒后它仍在运行,那么下一个实例会发挥作用还是会等待?
...当一个作业在下一个执行时间发生时仍在执行时?
例如,如果我有一个工作每 30 秒发生一次,并且在 30 秒后它仍在运行,那么下一个实例会发挥作用还是会等待?
简短的回答是将执行一个新作业,除非您从 IStatefulJob 继承,在这种情况下,一次只允许运行一个作业实例。
正如 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);
}
}
这样下一个作业不会在第一个作业完成后立即执行。