2010-10-09 23 views
8

Her 5 dakika için tekrar aralığı olan, zamanlanmış bir işim var. İyi çalışıyor.Quartz.NET işlemi eşzamanlı olarak nasıl yapılır?

Ama ilk işimin 5 dakika içinde bitmediği ve ikinci bir işin başladığı bir durumum var (5 dakika için planlandığı gibi).

Bunu yapmak istemiyorum, her seferinde sadece bir iş çalışıyor olmalı. Bunu nasıl yapabilirim?

Bu benim kodudur: Ben Quartz.net biraz kullandım

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

cevap

1

ancak işler arasında seri işlenmesini zorlayarak araştırıldı olmadı. Deneyimlerime göre, Quartz daha uzun süre çalıştıklarında işlerin üst üste gelebileceği "paralel" programlı işlemlere yöneliktir, dolayısıyla ihtiyacınız olanı destekleyip desteklemediğinden emin değilim.

Sorununuza basit bir çözüm, iş parçacıklarının herhangi biri tarafından erişilebilen bir senkronizasyon değişkeni (ör. Kilit, muteks, semafor veya global boole, vb.) Kullanmak olabilir. Yeni bir iş başladığında, kilidi kontrol etmeli ve eğer boşsa, al ve bitirene kadar bekle. Başka bir iş uyanırsa ve önceki bir işin hala devam ettiğini görürse, yeni iş çıkar ve zamanlayıcının bir sonraki aralıkta tekrar denemesini bekleyebilir. Ayrıca yeni bir işin bitmesini bekleyebilirsin, ama eğer bunu yaparsan, idam edilmek için beklemekte olan iş bulma riskini çalıştırırsın, ve sistem asla “yakalamaya” yetmez.

+0

Beklemek zorunda bile değil; senkronizasyon mekanizmasını deneyebilir ve yakalayabilir. Başarısız olursa, iş tamamlanmış ve yapılmalıdır. Eğer yakalarsa, o zaman işlenmelidir. "Yakalama" yok. Tabii ki, atlandığı gerçeği günlüğe kaydedilmeli ve bu noktadaki program tekrar değerlendirilmelidir. – casperOne

30

Quartz.NET 2.x

IJob uygulayın ve ayrıca [DisallowConcurrentExecution] özniteliği ile Mesleğinizi süsleyin. Daha fazla bilgi için DisallowConcurrentExecutionAttribute API belgelerini okuyun.

Quartz.NET 1.x

iş sınıfı IStatefulJob yerine IJob uygulamak olun. Daha fazla bilgi için IStatefulJob API belgelerini okuyun.

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

+7

Veya Quartz.net 2.0'da IJob'u uygulayın ve – Cocowalla

+0

"DisallowConcurrentExecution" özniteliği ile dekore edin. –

+0

@Neo yanıtını güncelledim, lütfen doğru cevabı güncelleyin. – regisbsb

İlgili konular