我安排了Quartz工作的.net网络服务,我以下代码每天凌晨4点开始工作,每12小时重复一次。每项工作的开始时间不同。这里的问题是,当我说时,它不是在凌晨4点开始,而是每天只在凌晨12点和12点运行。我如何确保它在我向StartAtTime提出要求时才开始?如果我将我的cron表达式中的值减少到1/2并将开始时间更改为下午2点或下午3点,那么它会按预期工作。
var startAtTime = DateTime.Today.AddHours(localTime[Key]);
if (startAtTime.ToUniversalTime() < DateTime.UtcNow)
{
startAtTime = startAtTime.AddDays(1);
}
ITrigger objESLJobTrigger = TriggerBuilder.Create()
.WithIdentity("ESLTrigger-", AuditType.ESL.ToString())
.StartAt(new DateTimeOffset(startAtTime))
.WithCronSchedule("0 0 0/12 ? * SUN-SAT", x => x.WithMisfireHandlingInstructionIgnoreMisfires())
.Build();
答案 0 :(得分:1)
它的工作原理应该如此。见
.StartAt()
方法定义何时启动触发器,而不是作业。 0 0 0/12 ? * SUN-SAT
意味着&#34; 每天上午12点和下午12点运行&#34; (您可以使用cronmaker进行检查。)Cron Scheduler对您的情况没有帮助,因为它适用于您期望的different way中的间隔:
/ - 用于指定增量。例如,秒字段中的“0/15”表示“秒0,15,30和45”。并且秒字段中的“5/15”表示“秒5,20,35和50”。你也可以在''字符后指定'/' - 在这种情况下''相当于在'/'之前有'0'。日期字段中的“1/3”表示“从该月的第一天开始每3天触发一次”。
所以像0 0 4/12 ? * SUN-SAT
这样的表达式将在凌晨4点和下午4点每隔12小时运行一次。并且0 0 5/12 ? * SUN-SAT
将在凌晨5点和下午5点每12小时运行一次。并且StartAt()方法仅定义何时触发第一个作业(在凌晨4点或下午4点),它不会为cron表达式做偏移。
只需使用SimpleSchedule:
ITrigger objESLJobTrigger = TriggerBuilder.Create()
.WithIdentity("ESLTrigger-", AuditType.ESL.ToString())
.StartAt(new DateTimeOffset(startAtTime))
.WithSimpleSchedule(x => x
.WithIntervalInHours(12)
.RepeatForever())
.Build();