Ich habe einen geplanten Job mit Wiederholungsintervall für alle 5 Minuten. Es funktioniert gut.
Aber ich habe eine Situation, in der mein erster Job nicht in 5 Minuten abgeschlossen ist und ein zweiter Job beginnt (wie es für 5 Minuten geplant ist).
Ich möchte das nicht machen, nur ein Job sollte gleichzeitig arbeiten. Wie kann ich das machen?
Das ist mein Code:
%Vor%Ich habe Quartz.net ein wenig benutzt, aber nie untersucht, ob ich die serielle Verarbeitung zwischen Jobs durchsetzen kann. Aus meiner Erfahrung ist Quartz eher für die "parallele" zeitgesteuerte Verarbeitung gedacht, bei der Jobs sich überlappen können, wenn sie lange laufen, also bin ich mir nicht sicher, ob sie das unterstützt, was Sie brauchen.
Eine einfache Lösung für Ihr Problem könnte die Verwendung einer Synchronisationsvariablen sein, auf die alle Job-Threads zugreifen können (z. B. eine Sperre, Mutex, Semaphor oder globaler Boolescher Wert usw.). Wenn ein neuer Job gestartet wird, sollte er die Sperre überprüfen und wenn es frei ist, schnappen Sie es und halten Sie es, bis es fertig ist. Wenn ein anderer Job aufwacht und erkennt, dass ein vorheriger Job noch ausgeführt wird, kann der neue Job einfach beendet werden und warten, bis der Scheduler beim nächsten Intervall erneut versucht. Sie könnten auch den neuen Job warten lassen, bis der vorherige fertig ist, aber wenn Sie das tun, riskieren Sie, dass sich Jobs häufen, die darauf warten, ausgeführt zu werden, und das System niemals "aufholt".
Quartz.NET 2.x
Implementieren Sie IJob
und dekorieren Sie Ihre Jobklasse mit [DisallowConcurrentExecution]
attribute. Weitere Informationen finden Sie in der API-Dokumentation für DisallowConcurrentExecutionAttribute
.
Quartz.NET 1.x
Setzen Sie die Jobklasse auf IStatefulJob
und nicht auf IJob
. Weitere Informationen finden Sie in der API-Dokumentation für IStatefulJob
.
Tags und Links .net quartz.net