我們使用Quartz.Net在Windows服務 中按計劃觸發作業。 我有一種情況,我必須每5 minutes
從Start DateTime
觸發一個工作,直到End DateTime
。Quartz.NET - 作業完成後調用函數完全執行
後作業完成,我們需要計算Next Start DateTime
和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
在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
我需要做的是調用一個方法只有一次1個作業迭代結束後 - (作業執行12次後)?
如何在Quartz中執行此操作?
編輯
創建觸發器
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;
}
編輯 觸發使用Cron:
trigger = TriggerBuilder.Create()
.WithIdentity(string.Format("trigger_{0}", 1), "Group1")
.WithCronSchedule("0 0-45/5 7-7 ? * TUE,WED *").Build();
你可以從cron表達式上面看到它將從每運行5 minutes
每Tuesday
和Wednesday
。
所以1次迭代是7AM to 7:45 AM
on Tuesday
,接下來是7 AM to 7:45
on Wednesday
。我需要在每次迭代完成後調用一個函數。
所以我們假設當最後的觸發器被觸發爲7:45 AM on Tuesday
- 我需要調用該函數。
你是什麼意思是「整個作業」嗎?你正在執行這個工作12次,所以你爲什麼期望這些方法只被調用一次? – yonisha
這就是我需要的 - 經過一次完整的迭代後,我需要啓動一個方法來計算下一個開始和結束日期 –
也許你的工作課上有一個靜態計數器? –