2016-04-03 24 views
0

Aşağıda gösterildiği gibi yeniden programlama kodunu yazdım. "120 saniyede bir tekrarla" diyen programa rağmen, Execute() yöntemi, UpdateQuartzJobTrigger yöntemini tamamladıktan hemen sonra çağrılmaya devam ediyor.Quartz.NET beklendiği gibi çalışma değil

class Model : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      Debug.WriteLine("Executing Job: " + DateTime.Now.ToShortTimeString()); 
      //Do some stuff 
      UpdateQuartzJobTrigger(context); 
     } 
     private void UpdateQuartzJobTrigger(IJobExecutionContext context) 
     { 
      // Trigger the job to run now, and then every 120 seconds 
      ITrigger trigger = TriggerBuilder.Create() 
       .WithIdentity(context.Trigger.Key.Name, context.Trigger.Key.Group) 
       .WithSimpleSchedule(x => x 
        .WithIntervalInSeconds(120) 
        .RepeatForever()) 
       .Build(); 
      var result = context.Scheduler.RescheduleJob(context.Trigger.Key, trigger); 
     } 
    } 
+0

Olası yinelenen [Quartz.Net set - Başlamak için basit bir tetikleyiciyi geciktirin) (http://stackoverflow.com/questions/3515542/quartz-net-delay-a-simple-trigger-to-start) –

+0

@AndrewMorton, bu iki kopyadan çok uzaktır. Sorunuzdaki OP, bir hizmet başlatırken ** tetikleyicileri ertelemeye çalışıyor. Herhangi bir şeyi ertelemeye çalışmıyorum, bu programın ölçütleri karşılandığında tetikleyicinin yeniden planlanması ve tetiklenmesini istiyorum. – Ashish

cevap

1

IMHO, en iyi uygulama daha sonra RescheduleJob birleştirmek "Yürütme" değil olacaktır.

WithIntervalInSeconds "hemen" başlayacak ... X saniye bekleyin ve sonra tekrar gidin. X saniye için "gecikme" yapmaz.

Temel olarak, "işinizi" tamamlıyorsunuz, daha sonra HEMEN yeniden programlıyorsunuz ... fakat gecikme olmadığından (@AM noktaları çıktığında) hemen yeniden zaman ayarlanıyor.

İş yaratma mantığınızı iş yürütme mantığınızdan ayıracağım.

Ya buraya bakın:

How to do “sequential” Job Scheduling (Quartz?)

Ama doğru olanı karşılaştığınız davranışı tasarlanmış şekilde kullanın. WithIntervalInSeconds, "ilk yürütmeyi geciktir" davranışına sahip değil. 1. ve 2. infazlar arasındaki zamandır .... (ve 2. ve 3. vb.).

+0

Teşekkürler @granadacoder. Bu davranışı biraz garip buluyorum, çünkü TriggerBuilder içinde StartNow() adlı başka bir yöntem var, bu da artık WithInterval'ın kullanılması durumunda gereksiz görünüyor. – Ashish

+0

Ben tüm quirkies için java adamlar (onun bir java portu üzerinden) suçluyorum! (Haha) – granadaCoder

1

kodunuzda açıklama bile şu anda yayınlanıyor istemiyorsanız o // Trigger the job to run now, and then every 120 seconds

gerekiyordu belirtir, ardından bir başlangıç ​​zamanı içinde, örneğin

 ITrigger trigger = TriggerBuilder.Create() 
      .WithIdentity(context.Trigger.Key.Name, context.Trigger.Key.Group) 
      .WithSimpleSchedule(x => x 
       .WithIntervalInSeconds(120) 
       .RepeatForever()) 
      .StartAt(DateBuilder.FutureDate(120, IntervalUnit.Second)) 
      .Build(); 
İlgili konular