Quartz.NET重新安排不按预期工作

时间:2016-04-03 17:48:05

标签: quartz.net

我已经写了重新安排的代码,如下所示。尽管时间表说“每120秒重复一次”,但在结束UpdateQuartzJobTrigger方法后,Execute()方法会立即被调用。

 class Model : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Debug.WriteLine("Executing Job: " + DateTime.Now.ToShortTimeString());
            //Do some stuff
            UpdateQuartzJobTrigger(context);
        }
        private void UpdateQuartzJobTrigger( IJobExecutionContext context )
        {
            // Trigger the job to run now, and then every 120 seconds
            ITrigger trigger = TriggerBuilder.Create()
              .WithIdentity(context.Trigger.Key.Name, context.Trigger.Key.Group)
              .WithSimpleSchedule(x => x
                  .WithIntervalInSeconds(120)
                  .RepeatForever())
              .Build();
            var result = context.Scheduler.RescheduleJob(context.Trigger.Key, trigger);
        }
    }

2 个答案:

答案 0 :(得分:1)

恕我直言,最佳做法是不要将“执行”和“重新安排工作”结合起来。

WithIntervalInSeconds将“立即”启动...等待X秒,然后再次启动。它不会“延迟”X秒。

所以基本上,你正在完成你的“工作”,然后立即重新安排它...但由于没有延迟(如@AM指出),它会立即重新安排。

我会将你的工作创造逻辑与你的工作执行逻辑分开。

或者看这里:

How to do “sequential” Job Scheduling (Quartz?)

但您所遇到的是正确的设计行为。 WithIntervalInSeconds没有“延迟首次执行”行为。这是第1次和第2次执行之间的时间....(以及第2次和第3次,依此类推等等)。

答案 1 :(得分:1)

您的代码中的注释甚至表明它应该// Trigger the job to run now, and then every 120 seconds

如果您不希望它立即运行,请设置开始时间,例如

        ITrigger trigger = TriggerBuilder.Create()
          .WithIdentity(context.Trigger.Key.Name, context.Trigger.Key.Group)
          .WithSimpleSchedule(x => x
              .WithIntervalInSeconds(120)
              .RepeatForever())
          .StartAt(DateBuilder.FutureDate(120, IntervalUnit.Second))   
          .Build();