6

Ich verwende Quartz Scheduler als eine Spring Bean in einer Clusterumgebung.Quartz Scheduler: Trigger einige Jobs auf jedem Cluster-Knoten und einige nur einmal pro Cluster

Ich habe einige Jobs mit @NotConcurrent annotiert und sie laufen einmal pro Cluster (d. H. Nur in einem Knoten, nur in einem Thread).

Jetzt muss ich einen Job auf jedem Knoten des Clusters ausführen. Ich habe die Annotation @NotConcurrent entfernt, aber sie wird nur auf jedem Thread auf einem Computer ausgeführt. Es wird nicht auf anderen Knoten ausgelöst.

Womit soll ich den Job annotieren?

Beispiel: Job1 NotConcurrent mit Anmerkungen ist um Mitternacht geplant => Es wird nur jeden Mitternacht auf 1 Maschine ausgelöst. Job2 mit Anmerkungen versehen um Mitternacht => Er feuert jeden Mitternacht auf jede Maschine.

Vielen Dank.

Antwort

7

AFAIK Quarzuhr wird immer auf einem einzelnen Knoten ausgeführt, der von Quartz ausgewählt wird. Die Annotation @NonConcurrent verhindert nur, dass Quartz denselben Job gleichzeitig auf einem bestimmten Knoten ausführt.

Mit anderen Worten, Sie können Quartz nicht gleichzeitig einen Job auf mehreren Knoten ausführen lassen. Es wählt immer einen einzelnen Knoten aus, um den Job auszuführen.

Um zu realisieren, was Sie beschreiben, benötigen Sie möglicherweise mehrere Jobs (mit derselben Jobklasse und ohne zugehörige Trigger). Dann müssen Sie eine Art von Orchestrator-Job implementieren, der eine entfernte Verbindung herstellt, z. über JMX oder RMI an einzelne Knoten und löst die Jobs manuell aus. Sie können unser Produkt QuartzDesk (www.quartzdesk.com) überprüfen, das einen Web-Service bereitstellt, der einen einzelnen Endpunkt bietet, über den Sie eine Verbindung zu einzelnen Quartz-Scheduler-Instanzen herstellen und z. B. Aufträge für sie auslösen können.

+3

Danke. Da ich diese Einschränkung kannte, verwendete ich feder @ Scheduled Annotation mit einem Cron-Ausdruck, um diesen Job auf allen Clusterknoten zu starten. Dieser hybride Ansatz funktioniert ziemlich gut. – fnqlo

+0

Hallo Jan, kannst du bitte eine mögliche Lösung genauer erklären? Ich habe ein ähnliches Problem, ich muss eine Aufgabe auf allen Weblogic-Knoten ausführen (derzeit sind es 2). Ich würde es gerne ad hoc machen können (z.B. von einem Servlet). Ich verwende bereits Quarz für einige geplante Jobs, also habe ich mich gefragt, ob es möglich ist, diese Aufgabenverteilung an sie zu delegieren. Danke – andreybavt

+0

Die Idee war, dass Sie Ihre Worker-Jobs implementieren, aber Sie keine Trigger mit ihnen verknüpfen. Dann haben Sie eine Art von Orchestrator-Job, der mit einem Trigger verknüpft wird. Wenn Quartz den Orchestrator-Job auslöst, stellt der Job über den JMX-, RMI- oder JAX-WS-Webdienst (wenn QuartzDesk vorhanden ist) eine Verbindung zu den Quartz-Knoten her, auf denen Sie Ihre Worker-Jobs ausführen möchten. Wenn Sie möchten, dass Ihre Worker-Jobs auf allen Quartz-Instanzen ausgeführt werden, durchläuft der Orchestrator-Job einfach die Liste der konfigurierten Quartz-Instanzen und löst diese Jobs "manuell" über JMX/RMI/JAX-WS aus. –

Verwandte Themen