2016-04-03 9 views
0

Ich habe den Umplanungscode wie unten dargestellt geschrieben. Trotz des Terminplans "Alle 120 Sekunden wiederholen" wird die Execute() -Methode nach dem Abschluss der UpdateQuartzJobTrigger-Methode aufgerufen.Quartz.NET Reschedule funktioniert nicht wie erwartet

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

Mögliche Duplikat [Quartz.Net - Verzögerung eines einfachen Auslösers zu starten] (http://stackoverflow.com/questions/3515542/quartz-net-delay-a-imple-trigger-to-start) –

+0

@AndrewMorton, diese beiden sind weit entfernt von Duplikaten. Das OP in Ihrer Frage versucht, Trigger zu verzögern, wenn ** ein Dienst gestartet wird. Ich versuche nicht, etwas zu verzögern, ich möchte, dass der Auslöser neu geplant und ausgelöst wird, wenn die Kriterien für diesen Zeitplan erfüllt sind. – Ashish

Antwort

1

IMHO, eine Best Practice wäre, nicht kombinieren "Execute" und dann RescheduleJob.

Die WithIntervalInSeconds wird "sofort" starten ... warten Sie X Sekunden und dann erneut. Es verzögert sich nicht um X Sekunden.

Also im Grunde, Sie vervollständigen Ihren "Job", dann sofort umterminieren es ... aber da es keine Verzögerung (wie @AM weist darauf hin), wird es sofort neu geplant.

Ich würde Ihre Job-Erstellungslogik von Ihrer Job-Ausführungslogik trennen.

Oder schauen Sie hier:

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

Aber was Sie erleben korrekt ist, Verhalten wie gestaltet. WithIntervalInSeconds hat kein Verhalten "Verzögerung der ersten Ausführung". Es ist die Zeit zwischen der 1. und 2. Ausführung .... (und die 2. und 3. usw. und so weiter).

+0

Danke @granadacoder. Ich finde dieses Verhalten etwas merkwürdig, weil es im TriggerBuilder eine andere Methode namens StartNow() gibt, die jetzt redundant erscheint, wenn WithInterval verwendet wird. – Ashish

+0

Ich beschuldige die Java-Jungs (seit es ein Java-Port über) für alle Quirkies !! (Haha) – granadaCoder

1

Der Kommentar im Code zeigt auch, dass es // Trigger the job to run now, and then every 120 seconds

angeblicher Wenn Sie es einrichten jetzt nicht wollen, dann eine Startzeit ausgeführt wird, zB

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