我希望下次将作业安排在quartz.net中执行。该作业是非并发的,可能有多个触发器,其中一些已暂停。
当作业正在执行时,状态NORMAL
中的所有触发器都将设置为阻止。状态为PAUSED
的所有触发器都设置为PAUSED_BLOCKED
。 Quartz.net报告在作业执行时状态为PAUSED_BLOCKED
的触发器为Blocked
。
我尝试了以下代码:
private DateTimeOffset? GetNextFireTime (JobKey jobKey)
{
var triggers = scheduler.GetTriggersOfJob (jobKey);
return triggers.Where (IsActive).Select (x => x.GetNextFireTimeUtc ()).Min ();
}
private bool IsActive (ITrigger trigger)
{
return IsActive (scheduler.GetTriggerState (trigger.Key));
}
private static bool IsActive (TriggerState state)
{
return state == TriggerState.Normal || state == TriggerState.Blocked;
}
问题是它还包括暂停的触发器,其中许多触发器在过去有下一个触发时间。我不能排除被阻止的触发器,否则我也会忽略未暂停的触发器。
使用单个火灾触发器时,问题最明显。这会导致所有其他触发器将其状态报告为blocked
,但单个触发触发器会将其状态报告为Complete
。如果忽略阻塞触发器,则结果是没有找到下一个触发时间。如果包含阻止触发器,则结果是暂停触发器包含,下一个触发时间在遥远的过去。