2010-10-09 11 views
8

Ho un lavoro programmato con intervallo di ripetizione ogni 5 minuti. Funziona bene.Come eseguire il processo Quartz.NET in modo sincrono?

Ma ho una situazione in cui il mio primo lavoro non sta completando in 5 minuti e un secondo lavoro sta iniziando (come previsto per 5 minuti).

Non voglio farlo, solo un lavoro dovrebbe funzionare alla volta. Come lo posso fare?

Questo è il mio codice:

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

risposta

1

ho usato Quartz.net un po ', ma mai indagato far rispettare l'elaborazione seriale tra posti di lavoro. Dalla mia esperienza, Quartz è più destinato all'elaborazione programmata "parallela", in cui i lavori possono sovrapporsi se vengono eseguiti a lungo, quindi non sono sicuro che supporti ciò di cui hai bisogno.

Una soluzione semplice al problema potrebbe essere quella di utilizzare una variabile di sincronizzazione a cui è possibile accedere da qualsiasi thread di processo (ad esempio un blocco, mutex, semaforo o booleano globale, ecc.). Quando si avvia un nuovo lavoro, dovrebbe controllare il lucchetto e, se è libero, afferrarlo e tenerlo premuto fino al termine. Se un altro lavoro si riattiva e vede che un lavoro precedente è ancora in esecuzione, il nuovo lavoro può solo uscire, e attendere che lo scheduler riprovi nell'intervallo successivo. Si potrebbe anche aspettare che il nuovo lavoro finisca prima, ma se lo fai, corri il rischio che i lavori si accumulino in attesa di esecuzione, e il sistema non "si rialzi".

+0

Non è nemmeno necessario attendere; può provare e afferrare il meccanismo di sincronizzazione. Se fallisce, il lavoro dovrebbe restituire che è completo ed eseguito. Se lo prende, dovrebbe elaborarlo. Non c'è "recupero". Naturalmente, il fatto che sia saltato dovrebbe essere registrato, e si dovrebbe rivalutare la sua pianificazione in quel punto. – casperOne

30

Quartz.NET 2.x

Implementare IJob e anche decorare la vostra categoria di lavoro con l'attributo [DisallowConcurrentExecution]. Leggi la documentazione dell'API per DisallowConcurrentExecutionAttribute per ulteriori informazioni.

Quartz.NET 1.x

rendere la classe lavoro implementare IStatefulJob piuttosto che IJob. Leggi la documentazione dell'API per IStatefulJob per ulteriori informazioni.

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

+7

Oppure in Quartz.net 2.0, implementare IJob e decorare con l'attributo 'DisallowConcurrentExecution' – Cocowalla

+0

grazie Ho aggiornato la risposta –

+0

@Neo, si prega di aggiornare la risposta corretta. – regisbsb

Problemi correlati