2010-10-09 20 views
8

Mam zaplanowane zadanie, które ma interwał powtarzania co 5 minut. Działa dobrze.Jak synchronizować proces Quartz.NET?

Ale mam sytuację, w której moja pierwsza praca nie kończy się w 5 minut i rozpoczyna się drugie zadanie (zaplanowane na 5 minut).

Nie chcę tego robić, tylko jedna praca powinna działać na raz. Jak mogę to zrobić?

To jest mój kod:

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(); 

Odpowiedz

1

Użyłem Quartz.net trochę, ale nigdy nie badano egzekwowania przetwarzania szeregowego między zadaniami. Z mojego doświadczenia wynika, że ​​Quartz jest bardziej przeznaczony do "równoległego" zaplanowanego przetwarzania, w którym zadania mogą się nakładać, jeśli działają długo, więc nie jestem pewien, czy obsługuje to, czego potrzebujesz.

Prostym rozwiązaniem problemu może być użycie zmiennej synchronizacji, do której dostęp ma dowolny wątek zadania (np. Blokada, muteks, semafor lub globalna wartość logiczna itd.). Po uruchomieniu nowej pracy należy sprawdzić blokadę, a jeśli jest wolna, chwycić ją i przytrzymać, aż do końca. Jeśli inne zadanie zostanie przebudzone i okaże się, że poprzednie zadanie nadal działa, nowe zadanie może po prostu wyjść i czekać, aż program planujący spróbuje ponownie w następnym interwale. Możesz także zlecić nową pracę, aby zakończyła się poprzednia, ale jeśli to zrobisz, ryzykujesz, że prace będą czekały na wykonanie, a system nigdy "nadrabia zaległości".

+0

Nie musi nawet czekać; może spróbować pobrać mechanizm synchronizacji. Jeśli się nie powiedzie, zadanie powinno powrócić, aby było kompletne i gotowe. Jeśli to chwyci, to powinno się przetworzyć. Nie ma "dogania". Oczywiście, fakt, że został pominięty, powinien zostać zarejestrowany, a następnie należy go ponownie ocenić w tym momencie. – casperOne

30

Quartz.NET 2.x

Wdrożenie IJob a także ozdobić swoją klasę pracy z atrybutem [DisallowConcurrentExecution]. Zapoznaj się z dokumentacją interfejsu API dla DisallowConcurrentExecutionAttribute, aby uzyskać więcej informacji.

Quartz.NET 1.x

Bądź klasa zadanie wdrożyć IStatefulJob zamiast IJob. Zapoznaj się z dokumentacją interfejsu API dla IStatefulJob, aby uzyskać więcej informacji.

http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire

+7

Lub w Quartz.net 2.0, zaimplementuj IJob i udekoruj atrybutem "DisallowConcurrentExecution" – Cocowalla

+0

, dzięki temu zaktualizowałem odpowiedź –

+0

@Neo, zaktualizuj poprawną odpowiedź. – regisbsb