Geplante Spring-Task, die in einer Clusterumgebung ausgeführt wird
Ich Schreibe eine Anwendung, die über einen cron-job, der ausgeführt wird, alle 60 Sekunden. Die Anwendung ist so konfiguriert, Waage, wenn erforderlich, auf mehrere Instanzen. Ich will nur zum ausführen der task auf 1 Instanz alle 60 Sekunden (Auf einem Knoten). Aus der box kann ich nicht finden, eine Lösung für dieses, und ich bin überrascht, es wurde nicht gefragt, mehrere Male vor. Ich bin mit Spring 4.1.6.
<task:scheduled-tasks>
<task:scheduled ref="beanName" method="execute" cron="0/60 * * * * *"/>
</task:scheduled-tasks>
Jede Beratung würde sehr geschätzt werden.
Dank
InformationsquelleAutor der Frage user3131879 | 2015-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Batch und geplante Aufträge laufen in der Regel auf Ihre eigenen standalone-Server, Weg vom customer-facing-apps so es ist nicht eine häufige Anforderung, um eine Aufgabe in einer Anwendung, die erwartet, dass Sie auf einem cluster. Darüber hinaus werden Arbeitsplätze in Cluster-Umgebungen in der Regel nicht brauchen, um über andere Instanzen der gleichen Aufgabe parallel ausgeführt, so dass ein weiterer Grund, warum die Isolierung der job-Instanzen ist keine große Anforderung.
Eine einfache Lösung wäre die Konfiguration Ihrer Arbeitsplätze innerhalb eines Feder-Profil. Zum Beispiel, wenn Ihre aktuelle Konfiguration ist:
ändern:
Dann starten Sie Ihre Anwendung auf nur einer Maschine mit der
scheduled
Profil aktiviert (-Dspring.profiles.active=scheduled
).Wenn der primäre server nicht verfügbar ist aus irgendeinem Grund, starten Sie einfach einen anderen server mit dem Profil, das aktiviert und es wird auch weiterhin gut funktionieren.
Dinge ändern, wenn Sie möchten, dass die automatische failover für die Arbeitsplätze als gut. Dann, Sie müssen, um den job auf allen Servern ausgeführt werden, und überprüfen Sie die Synchronisation über eine gemeinsame Ressource, wie eine Datenbank-Tabelle einen clustered-cache, JMX variable, etc.
InformationsquelleAutor der Antwort manish
Es ist ein ShedLock Projekt dient genau diesem Zweck. Sie nur kommentieren von Aufgaben, die gesperrt werden soll, wenn Sie ausgeführt
Konfigurieren Frühling und ein LockProvider (SQL und Mongo derzeit unterstützt)
InformationsquelleAutor der Antwort Lukas
Ich glaube, Sie haben zu verwenden Quarz-Clustering mit JDBC-JobStore für diesen Zweck
InformationsquelleAutor der Antwort alexanoid
Das ist eine einfache und robuste Möglichkeit, um sicher einen job ausführen, in einem cluster. Sie können basierend auf Datenbank und führen Sie die Aufgabe nur, wenn der Knoten ist der "Führer" im cluster.
Auch wenn ein Knoten ausfällt oder heruntergefahren wird, die in dem cluster weitere Knoten wurde der Führer.
Alles, was Sie haben, ist die Schaffung eines "leader-election" - Mechanismus und jedes mal zu überprüfen, ob Ihr der Anführer:
Befolgen Sie diese Schritte:
1.Definieren Sie das Objekt und Tabelle, enthält einen Eintrag pro Knoten im cluster:
}
2.Erstellen Sie den Dienst, der a) schieben Sie den Knoten in der Datenbank , b) überprüfen Sie für den Führer
}
3.ping an die Datenbank zu senden, dass Ihr Leben
4.Sie sind bereit! Prüfen Sie einfach, wenn Sie der Anführer sind, bevor Sie diese Aufgabe ausführen:
InformationsquelleAutor der Antwort mspapant