2013-01-15 21 views
5

Ich arbeite an einem Projekt mit Quartz und war ein Problem mit den Abhängigkeiten mit Jobs.Quartz Jobs Abhängigkeit

wir haben eine Einstellung, in der A und B sind nicht abhängig von einander, obwohl C:

A und B können gleichzeitig laufen, aber C kann nur ausgeführt werden, wenn sowohl A als auch B abgeschlossen sind.

Gibt es eine Möglichkeit, diese Art von Szenario in Quartz einzustellen, so dass C nur ausgelöst wird, wenn A und B enden?

Antwort

5

Ich denke, dies ist der aktuelle Weg ist, es zu tun: http://www.quartz-scheduler.org/documentation/faq#FAQ-chain

auf dieser FAQ basiert, können Sie einen Job Zuhörer erstellen, die für A und B wartet zu beenden, und dann Job C planen einmal das passiert.

PS: Hier ist der Text bei der Link Änderungen:

Wie Kette I Job Ausführung? Oder: Wie erstelle ich einen Workflow?

Derzeit gibt es keine "direkte" oder "freie" Möglichkeit, Trigger mit Quartz zu ketten. Es gibt jedoch mehrere Möglichkeiten, wie Sie es ohne viel Aufwand erreichen können. Unten ist ein Überblick über einige Ansätze:

Eine Möglichkeit besteht darin, einen Listener (d. H. Einen TriggerListener, JobListener oder SchedulerListener) zu verwenden, der den Abschluss eines Jobs/Triggers erkennt und dann sofort einen neuen Trigger zum Auslösen plant. Dieser Ansatz kann ein wenig in Mitleidenschaft gezogen werden, da Sie den Zuhörer darüber informieren müssen, welcher Job welchem ​​folgt - und Sie müssen sich möglicherweise Gedanken über die Persistenz dieser Informationen machen. Sehen Sie sich den Listener org.quartz.listeners.JobChainingJobListener an, der mit Quartz ausgeliefert wird - da er bereits einige dieser Funktionen besitzt. Eine andere Möglichkeit besteht darin, einen Job zu erstellen, der in seiner JobDataMap den Namen des nächsten auszuführenden Jobs enthält, und wenn der Job abgeschlossen ist (der letzte Schritt in seiner execute() -Methode), plant der Job den nächsten Job. Mehrere Leute machen das und hatten viel Glück. Die meisten haben eine Basis- (abstrakte) Klasse erstellt, bei der es sich um einen Job handelt, der den Jobnamen und die JobDataMap-Gruppe mithilfe vordefinierter Schlüssel (Konstanten) ermitteln kann und Code zum Planen des identifizierten Jobs enthält. Diese abstrakte Job-Implementierung von execute() delegiert an eine abstrakte Template-Methode wie "doWork()" (wo die wirkliche Arbeit der ausdehnenden Job-Klasse abläuft) und enthält dann den Code für die Planung des Folge-Jobs. Dann machen sie einfach Erweiterungen dieser Klasse, die die Arbeit enthalten, die der Job erledigen sollte. Die Verwendung von "dauerhaften" Jobs oder die überladene Methode addJob (JobDetail, boolean, boolean) (hinzugefügt in Quartz 2.2) hilft der Anwendung, alle Jobs auf einmal mit ihren korrekten Daten zu definieren, ohne Trigger zu erstellen, um sie auszulösen (außer ein Auslöser, um den ersten Job in der Kette auszulösen).

In der Zukunft wird Quartz eine viel sauberere Möglichkeit bieten, dies zu tun, aber bis dahin müssen Sie einen der oben genannten Ansätze verwenden, oder denken Sie an einen anderen, der besser für Sie funktioniert.

Verwandte Themen