2010-10-09 3 views
8

J'ai un travail planifié qui ont un intervalle de répétition toutes les 5 minutes. Ça fonctionne bien.Comment rendre le processus Quartz.NET synchrone?

Mais j'ai une situation où mon premier travail ne se termine pas en 5 minutes et un deuxième travail commence (comme prévu 5 minutes).

Je ne veux pas faire cela, un seul travail devrait fonctionner à la fois. Comment puis je faire ça?

Ceci est mon code:

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

Répondre

1

Je l'ai utilisé Quartz.net un peu, mais jamais appliquer le traitement en série objet d'une enquête entre les emplois. D'après mon expérience, Quartz est plus destiné au traitement programmé "parallèle", où les travaux peuvent se chevaucher s'ils durent longtemps, donc je ne suis pas sûr si cela prend en charge ce dont vous avez besoin.

Une solution simple à votre problème pourrait être d'utiliser une variable de synchronisation accessible par n'importe quel thread de travail (par exemple un verrou, un mutex, un sémaphore ou un booléen global, etc.). Quand un nouveau travail démarre, il doit vérifier le verrou, et s'il est libre, attrapez-le et maintenez-le jusqu'à la fin. Si un autre travail se réveille et constate qu'un travail précédent est toujours en cours d'exécution, le nouveau travail peut simplement quitter et attendre que le planificateur réessaie à l'intervalle suivant. Vous pouvez également attendre que le nouveau travail soit terminé, mais si vous le faites, vous risquez de perdre des tâches en attente d'exécution et le système ne «rattrapera» jamais.

+0

Il n'a même pas à attendre; il peut essayer et saisir le mécanisme de synchronisation. Si cela échoue, alors le travail devrait retourner que c'est terminé et être fait. Si cela l'attrape, alors il devrait traiter. Il n'y a pas de "rattrapage". Bien sûr, le fait qu'il a sauté devrait être enregistré, et on devrait réévaluer son calendrier à ce moment-là. – casperOne

30

Quartz.NET 2.x

Mettre en œuvre IJob et aussi décorer votre classe d'emploi avec [DisallowConcurrentExecution] attribut. Lisez la documentation de l'API pour DisallowConcurrentExecutionAttribute pour plus d'informations.

Quartz.NET 1.x

Faire la classe d'emplois plutôt que de mettre en œuvre IStatefulJobIJob. Lisez la documentation de l'API pour IStatefulJob pour plus d'informations.

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

+7

Ou dans Quartz.net 2.0, implémenter IJob et décorer avec l'attribut 'DisallowConcurrentExecution' – Cocowalla

+0

merci d'avoir mis à jour la réponse –

+0

@Neo, veuillez mettre à jour la bonne réponse. – regisbsb