2014-11-28 4 views
1

Работа ведется по расписанию на Application_Start():Кварц: Debug нежелательными несколько задание выполняется

var y= JobBuilder.Create<YY>() 
      .WithIdentity("YY") 
      .Build(); 

ITrigger z= TriggerBuilder.Create() 
      .WithDescription("Runs.") 
      .WithDailyTimeIntervalSchedule(x => x 
      .WithIntervalInHours(24) 
      .OnEveryDay() 
      .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(9, 30)) 
      .InTimeZone(TimeZoneInfo.Utc)) 
      .Build(); 

Scheduler.ScheduleJob(y, z); 

в задании, я Logging «Работа Started» в самом начале. Работа выполнялась нормально в течение прошлых нескольких дней, но за последние 2 дня я могу видеть, что «Работа началась» 3 раза в журналах с разницей в несколько миллисекунд. То же самое происходит с почтовой программой уведомления, которая добавляется в задание.

Я подозреваю, что это связано с инструкциями по пропуску зажигания, но есть ли какой-либо подход отладки и определения причины проблемы, а также для обеспечения выполнения только одного экземпляра задания.

Это задание занимает 1-1,5 часа для выполнения, и возможно, что перезагрузка сервера и развертывание произошли во время запуска задания. Может ли это повлиять на сценарий запуска.

+0

Я думаю, что на самом деле произошло то, что этот конкретный код выполнялся несколько раз подряд. Я не думаю, что это вопрос кварца. Скорее всего, код, запускающий этот код, запускался несколько раз. Какую версию кварца вы используете? – Nzall

+0

Quartz version is 2.2.2 И поскольку планировщик находится в Application_Start(), я не уверен, что он может работать несколько раз. Существуют и другие задания (не долгое время), которые запланированы одинаково и работают нормально. – crazydiv

+0

Ну, у меня была такая проблема, и это было связано с копированием пасты, когда мы добавляли новое задание, мы скопировали существующий блок определения заданий и изменили все, кроме запускаемого задания, так что новый триггер запускал существующее задание. Удостоверьтесь, что ваша проблема не что-то в этом роде! – hazimdikenli

ответ

0

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

Планировщик имеет метод checkExists(), который может принимать jobKey или triggerKey и возвращает true, если задание или триггер уже существуют.

Обратите внимание, что из-за близости этих рабочих мест может быть состояние гонки, которое в редких случаях может привести к двойному выполнению задания.

0

Определите вашу работу так:

[DisallowConcurrentExecution] 
public class YourJobClass : IJob 
{ 
    // Your Code... 
} 

[DisallowConcurrentExecution] Атрибут убеждается есть макс один экземпляр работы в любое время.

Это только предположение, но, возможно, следующий код может помочь, если ваша проблема вызвана осечек:

Вы можете изменить свойства планировщика с помощью следующего кода:

IScheduler scheduler;   
ISchedulerFactory schedulerFactory; 
NameValueCollection propColl = new NameValueCollection(); 

propColl.Add("org.quartz.jobStore.misfireThreshold", "216000000"); // Amount of milliseconds that may pass till a trigger that couldn't start in time counts as misfired (216000000 ms => 1 hour) 
propColl.Add("org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow", "5"); // Trigger may fire up to 5 ms before scheduled starttime 
propColl.Add("quartz.threadPool.threadCount", "1"); // Allows only one Thread in parallel 
schedulerFactory = new StdSchedulerFactory(propColl); 
scheduler = schedulerFactory.GetScheduler(); 
scheduler.Start(); 

Что касается вашего вопроса о Отладка этой проблемы: я лично знаю только метод проб и ошибок. Измените мелочь и посмотрите, что произойдет.

Смежные вопросы