Запуск задания Quartz.net, которое запускается 3 раза подряд, должно быть только один раз

У меня есть следующий код для планирования заданий перезагрузки с помощью Quartz. Код устанавливает триггер для каждого дня недели (выбирается пользователем). Таким образом, задание должно выполняться не более одного раза в день. Однако, когда я тестирую его, он запускается три раза подряд, а не один раз. Любые идеи?

private void ScheduleJob(Server server)
{
    bool jobScheduled = false;
    JobDetail job = new JobDetail(server.ServerName, JOB_GROUP, typeof(RebootJob));
    job.JobDataMap.Add("Server", server);
    // Create a trigger for each day of the week on which this schedule falls
    for(int i=0; i < 7; i++)
    {
        DayOfWeek dayOfWeek = (DayOfWeek)i;
        DateTime? jobStartTime = server.GetNextScheduledRebootDateAndTime();
        if(server.isScheduledOnDayOfWeek(dayOfWeek) && jobStartTime.HasValue)
        {
            SimpleTrigger trigger = new SimpleTrigger(
                String.Format("{0}.{1}", server.ServerName, dayOfWeek.ToString()),
                JOB_GROUP,
                jobStartTime.Value.ToUniversalTime(),
                null,
                SimpleTrigger.RepeatIndefinitely,
                TimeSpan.FromDays(7 * (double)server.RebootFrequency)
            );
            if(!jobScheduled)
            {
                ManagementService.Instance.Scheduler.ScheduleJob(job, trigger);
                jobScheduled = true;
                // Add server to list of servers with a reboot schedule
                m_RebootableServers.Add(server.ServerName, server);
            }
            else // A job has already been schedule, just append triggers to it
            {
                trigger.JobName = job.Name;
                trigger.JobGroup = job.Group;
                ManagementService.Instance.Scheduler.ScheduleJob(trigger);
            }
        }
    }
}

person Trevor    schedule 14.03.2011    source источник


Ответы (1)


Похоже, вы настраиваете каждый триггер на срабатывание в одно и то же время и с одинаковым интервалом.

Ваш цикл «for», повторяющий «i», не учитывает тот факт, что «server.GetNextScheduledRebootDateAndTime()» всегда возвращает одно и то же время «следующей» перезагрузки. Я предполагаю, что вы тестируете сервер, настроенный на перезагрузку 3 дня в неделю, и все триггеры настроены на запуск в одно и то же время с интервалом повторения 7 дней.

Если вы настроены на использование SimpleTrigger, вам нужно сдвинуть время запуска триггера на день недели, на который вы хотите запланировать перезагрузку.

person Brandon    schedule 14.03.2011
comment
Абсолютно верно. У меня есть другой метод в объекте сервера с сигнатурой DateTime? GetNextScheduledRebootDateAndTimeAfter(System.DateTime), который я хотел использовать здесь. Я немного разочарован, что не уловил этого. Огромное спасибо! - person Trevor; 16.03.2011