我们正在使用 Quartz.Net 在 Windows 服务中按计划触发作业。
我有一种情况,我必须每次触发一个工作5 minutes
from Start DateTime
till End DateTime
.
工作完成后我们需要计算Next Start DateTime
and Next End DateTime
并保存到数据库 -
为此我尝试覆盖JobListener
其中有一个方法:JobWasExecuted
public class xPTJobListener : JobListenerSupport
{
public override string Name { get { return "xPTJobListener"; } }
public override void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
{
var dataMap = context.MergedJobDataMap;
var schedule = (MyDTO)dataMap["Schedule"];
using (var logger = new xPTLogger())
{
logger.LogMessage(MessageType.Information, string.Format("Inside JobWasExecuted() - [{0}] - ", schedule.Id));
}
base.JobWasExecuted(context, jobException);
}
}
还有TriggerComplete
in the TriggerListener
public class xPTTriggerListener : TriggerListenerSupport
{
public override string Name { get { return "xPTTriggerListener"; } }
public override void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)
{
var dataMap = context.MergedJobDataMap;
var schedule = (MyDTO)dataMap["Schedule"];
using (var logger = new xPTLogger())
{
logger.LogMessage(MessageType.Information, string.Format("Inside Trigger Complete - [{0}] - ", schedule.Id));
}
base.TriggerComplete(trigger, context, triggerInstructionCode);
}
}
但上述方法的问题在于,每次调用作业时,它们都会被执行。
所以如果我有一份工作从12:01 AM
并结束12:02 AM
每 5 秒 - 这两个方法都会被调用12 times
我需要的是在一个作业迭代结束后仅调用一次方法 - (在作业执行 12 次之后)?
我如何在石英中执行此操作?
EDIT
创建触发器
public static ITrigger GenerateTrigger(RouteMonitorScheduleDTO routeSchedule, double fGmtOffset, xPTLogger logger)
{
ITrigger trigger = null;
switch (routeSchedule.ScheduleInfo.PeriodType)
{
case PeriodTypeEnum.Once:
trigger = TriggerBuilder.Create()
.WithIdentity(string.Format("trigger_{0}", routeSchedule.RouteScheduleId), DefaultGroup)
.StartAt(routeSchedule.DepartureDateTime)
.WithSimpleSchedule(s => s.WithIntervalInMinutes(5))
.EndAt(routeSchedule.ArrivalDateTime.AddMinutes(5))
.Build();
break;
case PeriodTypeEnum.Daily:
case PeriodTypeEnum.WeekDays:
case PeriodTypeEnum.Weekly:
case PeriodTypeEnum.Monthly:
var schedule = routeSchedule.ScheduleInfo;
var cronExpresion = xPTCronBuilder.GenerateCronExpression(
schedule.PeriodType,
schedule.ScheduleStringValue,
fGmtOffset,
routeSchedule.DepartureDateTime,
routeSchedule.ArrivalDateTime.AddMinutes(5), 5);
trigger = TriggerBuilder.Create()
.WithIdentity(string.Format("trigger_{0}", routeSchedule.RouteScheduleId), DefaultGroup)
.WithCronSchedule(cronExpresion)
.Build();
break;
}
return trigger;
}
EDIT使用 Cron 触发:
trigger = TriggerBuilder.Create()
.WithIdentity(string.Format("trigger_{0}", 1), "Group1")
.WithCronSchedule("0 0-45/5 7-7 ? * TUE,WED *").Build();
正如您从上面的 cron 表达式中看到的,它将从以下位置运行7 AM to 7:45 AM
every 5 minutes
every Tuesday
and Wednesday
.
所以 1 次迭代是7AM to 7:45 AM
on Tuesday
,接下来是7 AM to 7:45
on Wednesday
。我需要在每次迭代完成后调用一个函数。
所以假设当最后一个触发器被触发时7:45 AM on Tuesday
- 我需要调用该函数。