Как сделать Quartz.NET процесс синхронный?
У меня есть запланированная работа, которая повторяется каждые 5 минут. Все работает нормально.
Но у меня есть ситуация, в которой моя первая работа не завершается за 5 минут, а вторая работа начинается (как и было запланировано на 5 минут).Я не хочу этого делать, только одна работа должна работать одновременно. Как я могу это сделать?
Вот мой код:
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = schedFact.GetScheduler();
Trigger emailTrigger = TriggerUtils.MakeMinutelyTrigger(5);
emailTrigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);
emailTrigger.Name = "EmailTrigger";
JobDetail emailJobDetail = new JobDetail("EmailJob", null, typeof(EmailJob));
sched.ScheduleJob(emailJobDetail, emailTrigger);
sched.Start();
2 ответа:
Я использовал Quartz.net немного, но никогда не исследовал принудительную последовательную обработку между заданиями. По моему опыту, Quartz больше предназначен для "параллельной" обработки по расписанию, где задания могут перекрываться, если они выполняются долго, поэтому я не уверен, что он поддерживает то, что вам нужно.
Простым решением вашей проблемы может быть использование переменной синхронизации, доступ к которой может получить любой из потоков задания (например, блокировка, мьютекс, семафор или глобальный логический элемент и т. д.). Когда начинается новая работа, она должна проверьте замок, и если он свободен, возьмите его и держите, пока он не будет закончен. Если другое задание просыпается и видит, что предыдущее задание все еще выполняется, новое задание может просто выйти и подождать, пока планировщик повторит попытку в следующем интервале. Вы также можете заставить новое задание ждать завершения предыдущего, но если вы это сделаете, вы рискуете, что задания будут накапливаться в ожидании выполнения, и система никогда не "догонит"."
Quartz.NET 2.x
Реализуйте
IJob
, а также украсьте свой класс заданий атрибутом[DisallowConcurrentExecution]
. Дополнительную информацию смотрите в документации по API дляDisallowConcurrentExecutionAttribute
.Quartz.NET 1.x
Сделайте класс заданий реализующим
IStatefulJob
, а неIJob
. Дополнительную информацию смотрите в документации по API дляIStatefulJob
.Http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire