Categories: Sonstiges

Einsteigerguide: Quartz API, Jobs und Trigger.

Bevor Sie den Scheduler verwenden können, muss dieser instanziiert werden.

Dazu verwenden Sie eine SchedulerFactory.

Einige Nutzer von Quartz können eine Instanz einer Factory in einem JDNI-Speicher behalten, andere finden es genauso einfach, eine Farbikinstanz direkt zu instanziieren und zu verwenden.

Sobald ein Scheduler instanziiert ist, kann er gestartet, in den Standby-Modus versetzt und heruntergeladen werden. Beachten Sie, dass ein einmal heruntergefahrener Scheduler nicht gestartet werden kann, ohne dass er neu instanziiert wird. Trigger werden erst ausgelöst, wenn der Scheduler gestartet wurde oder sich im pausierten Zustand befindet.

Hier ist ein kurzer Code-Schnipsel, der einen Scheduler instanziiert. Startet und einen Job zur Ausführung einplant:

Copy to Clipboard

Wie Sie sehen können, ist die Arbeit mit Quartz recht einfach. Im Folgenden geben wir einen kurzen Überblick über Jobs und Trigger und die API von Quartz, damit Sie dieses Beispiel besser verstehen können.

Die Quartz API.

Die wichtigsten Schnittstellen der Quartz-API sind:

  • Scheduler – die Haupt-API für die Interaktion mit dem Scheduler.
  • Job – eine Schnittstelle, die von Komponenten implementiert werden soll, die vom Scheduler augeführt werden sollen.
  • JobDetail – wird verwendet, um Instanzen von Jobs zu definieren.
  • Trigger – eine Komponente, die den Zeitplan definiert, nach dem ein bestimmter Job ausgeführt wird.
  • JobBuilder – zum Definieren/Erstellen von JobDetail-Instanzen, die Instanzen von Jobs definieren.
  • TriggerBuilder – zum Definieren/Erstellen von Triggerinstanzen.

Der Lebenszyklus eines Schedulers wird durch seine Erstellung über eine SchedulerFactory und einen Aufruf seiner shutdown()-Methode begrenzt. Einmal erstellt, kann die Scheduler-Oberfläche verwendet werden, um Jobs und Trigger hinzuzufügen, zu entfernen, aufzulisten und andere planungsrelevante Operationen durchzuführen (z.B. das Anhalten eines Triggers). Der Scheduler wird jedoch erst dann auf Trigger reagieren, wenn er mit der start()-Methode gestartet wurde, wie bereits oben gezeigt.

Quartz bietet „Builder“-Klassen, die eine domainspezifische Sprache definieren:

Copy to Clipboard

Der Codeblock, der die Jobdefinition aufbaut, verwendet Methoden, die statisch aus der JobBuilder-Klasse importiert wurden. Ebenso verwendet der Codeblock, der den Trigger erzeugt, Methoden, die aus der TriggerBuilder-Klasse importiert wurden.

Die statischen Importe der DSL können durch solche Importaussagen erreicht werden:

Copy to Clipboard

Die verschiedenen „ScheduleBuilder“-Klassen verfügen über Methoden, um verschiedene Arten von Zeitplänen zu definieren.

Die DateBuilder-Klasse enthält verschiedene Methoden zur einfachen Erstellung von java.util.date Instanzen für bestimmte Zeitpunkte (z.B. ein Datum, das die nächste gerade Stunde repräsentiert oder mit anderen Worten 10:00:00, wenn es aktuell 9:43:27 ist).

Jobs und Triggers.

Ein Job ist eine Klasse, die die Job-Interface implementiert, die nur eine einfache Methode hat:

Das Job-Interface.

Copy to Clipboard

Wenn der Trigger des Jobs feuert, wird die Methode execute(…) von einem der Worker-Threads des Schedulers aufgerufen. Das JobExecutionContext-Objekt, das an diese Methode übergeben wird, liefert der Jobinstanz Informationen über ihre „Laufzeitumgebung“ – ein Handle für den Scheduler, der sie ausgeführt hat, ein Handle für den Trigger, der die Ausführung ausgelöst hat, das JobDetail-Objekt des Jobs und einige andere Elemente.

Das JobDetail-Objekt wird vom Quartz-Client erstellt, wenn der Job dem Scheduler hinzugefügt wird. Es enthält verschiedene Eigenschaftseinstellungen für den Job sowie eine JobDataMap, in der Statusinformationen für eine bestimmte Instanz ihrer Jobklasse gespeichert werden können. Es ist im Wesentlichen die Definition der Job-Instanz.

Trigger-Objekte werden verwendet, um die Ausführung von Jobs auszulösen. Wenn Sie einen Job einplanen möchten, instanziieren Sie einen Trigger und „tunen“ seine Eigenschaften, um die gewünschte Einplanung durchzuführen. Triggern kann auch eine JobDataMap zugeordnet sein – dies ist nützlich, um Parameter an einen Job zu übergeben, die spezifisch für die Zusendung des Triggers sind. Quartz wird mit einer Handvoll verschiedener Triggertypen ausgeliefert, aber die am häufigsten verwendeten Typen sind SimpleTrigger und CronTrigger.

SimpleTrigger ist praktisch, wenn Sie eine einmalige Ausführung benötigen oder wenn Sie einen Job zu einem bestimmten Zeitpunkt starten und n-mal wiederholen müssen, mit einer Verzögerung von T zwischen den Ausführungen. CronTrigger ist nützlich, wenn Sie eine Triggerung nach kalenderähnlichen Zeitplänen wünschen – z.B. „jeden Freitag, mittags“ oder „um 10:15 Uhr am 10. eines jeden Monats“.

Warum Jobs und Trigger? Viele Job Scheduler haben keine eigenen Vorstellungen von Jobs und Triggern. Einige definieren einen „Job“ einfach als Ausführungszeit zusammen mit einer kleinen Jobkennung, Andere sind wir die Vereinigung von Quartz`Job und Triggerobjekten. Bei der Entwicklung von Quartz wurde entschieden, dass es sinnvoll ist, eine Trennung zwischen dem Zeitplan und den auszuführenden Arbeiten zu schaffen. Das hat viele Vorteile.

Beispielsweise können Jobs unabhängig von einem Trigger angelegt und im Job Scheduler gespeichert und viele Trigger können dem gleichen Job zugeordnet werden. Ein weiterer Vorteil dieser losen Kopplung ist die Möglichkeit, Jobs, die nach Ablauf der zugehörigen Trigger im Scheduler verbleiben, so zu konfigurieren, dass sie später neu eingeplant werden können, ohne dass sie neu definiert werden müssen. Außerdem können Sie einen Trigger ändern oder ersetzen, ohne den zugehörigen Job neu definieren zu müssen.

Identitäten.

Jobs und Trigger enthalten identifizierende Schlüssel, wenn sie im Quartz-Scheduler registriert sind. Die Tasten von Jobs und Triggern (JobKey und TriggerKey) erlauben es, diese in „Gruppen“ einzuteilen, was für die Organisation ihrer Jobs nützlich sein kann und Trigger in Kategorien wie „Reporting Jobs“ und „Maintenance Jobs“. Der Namensteil des Schlüssel eines Jobs oder Triggers muss innerhalb der Gruppe eindeutig sein – oder anders ausgedrückt, der komplette Schlüssel eines Jobs oder Triggers ist die Verbindung von Name und Gruppe.

3DMaster