Триггер Quartz.NET не срабатывает

я использую Quartz.NET в своем веб-приложении ASP.NET. я поместил следующий код в обработчик нажатия кнопки, чтобы убедиться, что он выполняется (в целях тестирования):

Quartz.ISchedulerFactory factory = new Quartz.Impl.StdSchedulerFactory();
Quartz.IScheduler scheduler = factory.GetScheduler();
Quartz.JobDetail job = new Quartz.JobDetail("job", null, typeof(BackupJob));
Quartz.Trigger trigger = Quartz.TriggerUtils.MakeDailyTrigger(8, 30); // i edit this each time before compilation (for testing purposes)
trigger.StartTimeUtc = Quartz.TriggerUtils.GetEvenSecondDate(DateTime.UtcNow);
trigger.Name = "trigger";
scheduler.ScheduleJob(job, trigger);
scheduler.Start();

вот "BackupJob":

public class BackupJob : IJob
{
    public BackupJob()
    {
    }

    public void Execute(JobExecutionContext context)
    {
        NSG.BackupJobStart();
    }
}

мой вопрос: почему «BackupJobStart ()» не срабатывает? Я использовал подобный код раньше, и он работал нормально.

РЕДАКТИРОВАТЬ: @Andy White, я бы добавил его в Application_Start в Global.asax. это не работает, поэтому я переместил его в обработчик нажатия кнопки, чтобы сузить проблему.


person Community    schedule 25.03.2009    source источник


Ответы (4)


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

Стоит попробовать (если вы еще этого не делаете):

Обновление: просто добавьте это в ваш program.cs, чтобы включить ведение журнала консоли:

Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info};
person Andy White    schedule 25.03.2009
comment
Это помогло мне найти проблему, моя заключалась в том, что класс, который выполнял мое задание, не имел общедоступного конструктора по умолчанию (без параметров). - person patrickbadley; 27.09.2017

Может быть, это проблема времени.

У меня была та же проблема, что и у вас, и я живу в стране, где время UTC + 2. Итак, когда я установил StartTimeUtc для триггера, я использовал DateTime.Now, поэтому триггер не должен был срабатывать до тех пор, пока два часа спустя, и я подумал, что он должен быть запущен в тот самый момент, когда мой код запустился.

Посмотрите внимательно время выполнения триггера и его StartTime

person Esabe    schedule 31.03.2010
comment
Большое спасибо! В этом была проблема, установка MY Quartz не работала. Я только что сделал что-то вроде: DateTime.Now.ToUniversalTime(), и он отлично работает. - person Timotei; 07.02.2012
comment
Эта проблема просто укусила меня. Я использовал .StartAt(DateTime.Now.AddMinutes(1)) при планировании заданий. Самое странное, раньше это работало идеально. - person Coxy; 28.05.2020

Другая возможность заключается в том, как вы запускаете планировщик. Я не совсем уверен, но вы можете столкнуться с проблемами, пытаясь запустить потоки планирования в приложении ASP.NET. Помещение объектов SchedulerFactory/Scheduler в обработчик нажатия кнопки не похоже на то, что это даст вам желаемые результаты.

Возможно, вам потребуется создать планировщик на более «глобальном» уровне, чтобы он мог работать в «фоновом режиме» приложения. Также может иметь смысл перенести любую запланированную работу в отдельную службу Windows, чтобы вам не приходилось поддерживать планировщик в веб-приложении.

Когда вы добивались успеха в прошлом, как вы вызывали планировщик?

person Andy White    schedule 25.03.2009

В моем случае была проблема с IoC — некоторые интерфейсы не были реализованы. Я мог видеть, что не так с моим, добавив ведение журнала:

Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info};

на Program.cs, как предложил Энди Уайт

person grrrrinaldi    schedule 12.09.2018