ich einen Windows-Dienst, der den Aufbau einer geplanten Aufgabe ausführt, die eine Warteschlange von Befehlen verarbeitet (von einem Legacy-System) in einem regelmäßigen Intervall (einmal pro min) unter Verwendung Quartz.netQuartz.net Erste Aussetzer zu ignorieren
Wenn die Aufgabe länger als 1 Minute dauert, was ungewöhnlich wäre, aber unter bestimmten Umständen möglich wäre, würde ich gerne die Auslöser ignorieren, die sie nicht ausgelöst haben.
Allerdings kann ich nicht scheinen, dass dies geschieht. Es führt die Verarbeitung durch und zündet dann schnell alle ausgelösten Auslöser in schneller Folge. Wie ich verstehe, können Sie einen Schwellenwert für die Fehlzündungen festlegen, aber ich bin nicht in der Lage, dies zum Funktionieren zu bringen.
Ich verwende [DisallowConcurrentExecution()] für den Job, um sicherzustellen, dass nur eine Instanz des Jobs gleichzeitig ausgeführt wird.
Unten sind ein paar Schnipsel. Zuerst einige Config-Informationen übergeben - setzt man so die Fehlzündungsschwelle?
NameValueCollection config = new NameValueCollection();
config.Add("quartz.jobStore.misfireThreshold", "600000");
schedFact = new StdSchedulerFactory(config);
Aufbau eines Triggers mit dem, was ich nehme an, die richtige Einstellung von Ignore Aussetzern sein:
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule( x => x.WithMisfireHandlingInstructionIgnoreMisfires()
.WithIntervalInSeconds(60)
.RepeatForever())
.Build();
Gedanken sehr geschätzt.
Code für den Job: Nur zu diesem Zeitpunkt mit groben Ideen zu spielen, so nur in einer Konsole App laufen und einen Auftrag zufällig verzögert, so dass es über das Intervall schießt, die nur auf 10 Sekunden dafür eingestellt ist. Alle gesicherten Fehlzündungen werden nach ein paar Verzögerungen schnell nacheinander ausgelöst.
[DisallowConcurrentExecution()]
public class SomeJob : IJob
{
public SomeJob() { }
public void Execute(IJobExecutionContext context)
{
Random rnd = new Random(DateTime.UtcNow.Second);
int delay = rnd.Next(2);
Console.WriteLine("Executing Job with delay of "+ delay + " at " + DateTime.UtcNow.ToString());
if (delay == 1)
{
System.Threading.Thread.Sleep(1000 * 25); // sleep for 25 seconds
}
}
}
Example console output:
Executing Job with delay of 1 at 21/05/2015 21:27:17
Executing Job with delay of 1 at 21/05/2015 21:27:42
Executing Job with delay of 0 at 21/05/2015 21:28:07 <-- stacked misfires
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:16
Executing Job with delay of 0 at 21/05/2015 21:28:26
Executing Job with delay of 1 at 21/05/2015 21:28:36
Executing Job with delay of 0 at 21/05/2015 21:29:01
Executing Job with delay of 0 at 21/05/2015 21:29:01
Executing Job with delay of 1 at 21/05/2015 21:29:06
Können Sie den Code für Ihren Job einfügen? – LeftyX
Danke für die Suche - Ich habe den ursprünglichen Beitrag mit Code aus dem Job aktualisiert. –
Alberne Frage: Wie kann Ihr Job alle 30 Sekunden ausgelöst werden, wenn Ihr Auslöser jede Minute ausgelöst wird? – LeftyX