как предотвратить немедленный запуск задания quartz

#quartz-scheduler #quartz.net

#quartz-планировщик #quartz.net

Вопрос:

У меня есть служба .net Windows, которая создает и планирует задания quartz, которые планируется запускать каждые 4 часа ВС-СБ, начиная с 4 часов утра в день запуска службы Windows. К сожалению, в тот момент, когда я запускаю свои задания службы Windows, они запускаются намного раньше графика и повторяют задания более пары раз, а позже работают только по расписанию. Как я могу предотвратить запуск заданий сразу после запуска моей службы Windows и запускать их только в запланированное время. Я использую планировщик crons. Я использую Oracle DB для поддержания своих графиков работы.

  ITrigger objESLJobTrigger = TriggerBuilder.Create()
                            .WithIdentity("Trigger-"   Key.ToString(), xxx.ToString())
                            .StartAt(DateTimeOffset.Parse(DateTime.Today.AddHours(4).ToString()).LocalDateTime)
                            .WithCronSchedule("0 0 0/4 ? * SUN-SAT", x => x.WithMisfireHandlingInstructionIgnoreMisfires())
                            .Build();
  

Ответ №1:

Обновлено после комментария: да, вам нужно использовать StartAt метод, но:

  • вам необходимо использовать сегодняшнюю дату, StartAt если служба запускается до 4 часов утра, в противном случае используйте завтрашнюю дату:

     var startAtDateTime = DateTime.Today.AddHours(4);
    if (startAtDateTime < DateTime.UtcNow)
    {
       startAtDateTime = startAtDateTime.AddDays(1);
    }
    
    and then use .StartAt(new DateTimeOffset(startAtDateTime))
      
  • обратите внимание, что StartAt ожидается время в формате UTC, а не в локальном, поэтому, если вам нужно запустить задание в 4 часа утра по местному часовому поясу, не забывайте о смещении часового пояса.

Кроме того, поскольку «ВС-СБ» означает каждый день, вы можете упростить выражение cron до 0 0 0/4 ? * *

Комментарии:

1. Спасибо за ответ. Но если я удалю when to startAt, как я могу определить, в какое время он должен запускать задание первым. Предположим, если я запущу свою службу Windows, в которой фактически размещен мой quartz, сегодня около 5 вечера вечером, и я хочу, чтобы моя работа начиналась только с завтрашнего утра в 4 часа утра, а затем каждые 4 часа после этого, как я могу это сделать.