Cron Expression无法正常工作

时间:2016-10-13 17:36:19

标签: quartz-scheduler quartz.net

我安排了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();

1 个答案:

答案 0 :(得分:1)

它的工作原理应该如此。见

  • .StartAt()方法定义何时启动触发器,而不是作业。
  • 并且您的cron表达式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();