4 Stimmen

Quartz.net-Scheduler und IStatefulJob

Ich frage mich, ob ich das richtig verstehe.

http://quartznet.sourceforge.net/apidoc/

IStatefulJob-Instanzen für anderen Regeln als normale IJob Instanzen. Der Hauptunterschied besteht darin, dass ihre zugehörige JobDataMap ist nach jeder Ausführung des Jobs neu persistiert Ausführung des Jobs neu persistiert wird und somit der Zustand für die nächste Ausführung. Der andere Unterschied ist, dass zustandsbehaftete Aufträge nicht erlaubt sind gleichzeitig ausgeführt werden dürfen, was bedeutet neue Auslöser, die vor dem Abschluss der Abschluss der Methode IJob.Execute auftreten, werden verzögert.

Bedeutet dies, dass alle Auslöser verzögert werden, bis ein anderer Auslöser ausgeführt wird? Wenn ja, wie kann ich es so machen, dass nur die gleichen Auslöser nicht ausgelöst werden, bis der vorherige Auslöser erledigt ist.

Angenommen, ich habe einen Auslöser A, der jede Minute ausgelöst wird, aber aus irgendeinem Grund ist er langsam und braucht anderthalb Minuten zur Ausführung. Wenn ich einfach einen Plan IJob verwende, wird der nächste Auslöser ausgelöst, und das möchte ich nicht. Ich möchte verhindern, dass Auslöser A erneut ausgelöst wird, bis er fertig ist.

Gleichzeitig habe ich jedoch einen Auslöser B, der ebenfalls jede Minute ausgelöst wird. Er läuft mit normaler Geschwindigkeit und wird jede Minute pünktlich beendet. Ich möchte nicht, dass Auslöser B wegen Auslöser A aufgehalten wird.

Meinem Verständnis nach würde genau das passieren, wenn ich IStatefulJob verwende.

3voto

Marko Lahma Punkte 6245

Kurzum Dieses Verhalten kommt von der Seite des Jobs. Unabhängig von der Anzahl der Trigger kann immer nur eine einzige Instanz eines bestimmten IStatefulJob (Job-Name, Job-Gruppe diktiert die Instanz-ID) zur gleichen Zeit laufen. Es kann also zwei Instanzen desselben Jobtyps geben, aber keine Jobs mit demselben Namen (Name, Gruppe), wenn der Job IStatefulJob implementiert.

Wenn der Abzug dadurch seine Feuerzeit verpasst, kommen die Anweisungen für Fehlzündungen zum Tragen. Ein Auslöser, der seine nächste Auslösung verpasst, weil der frühere Aufruf noch läuft, entscheidet auf der Grundlage seiner Fehlzündungsanweisung, was zu tun ist (siehe API und Lernprogramm).

Bei einem einfachen IJob gibt es keine Garantie dafür, wie viele Aufträge gleichzeitig ausgeführt werden, wenn es mehrere Auslöser dafür gibt und/oder Fehlzündungen auftreten. IJob ist nur eine Vertragsschnittstelle zum Aufrufen des Jobs. Quartz.NET 2.0 wird das kombinierte Verhalten von IStatefulJob in zwei separate Attribute aufteilen: DisallowConcurrentExecution und PersistJobDataAfterExecution.

Sie könnten also denselben Auftragstyp (IStatefulJobs) mit zwei Definitionen (unterschiedlichen Auftragsnamen) und Triggern mit entsprechenden Fehlzündungsanweisungen kombinieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X