Java-Bibliotheksklasse für die geplante Ausführung von "Callbacks"?

7

Mein Programm hat eine Komponente namens "Scheduler", mit der andere Komponenten Zeitpunkte für den Rückruf registrieren können. Dies sollte ähnlich wie der Unix-Cron-Dienst funktionieren, d. e. Sie sagen dem Scheduler, dass er mich um zehn Minuten nach jeder vollen Stunde benachrichtigen soll.

Mir ist klar, dass es in Java keine echten Callbacks gibt.

Hier ist mein Ansatz, gibt es eine Bibliothek, die das Zeug schon macht? Fühlen Sie sich frei, auch Verbesserungen vorzuschlagen.

Anruf bei Scheduler-Pässen registrieren:

  • eine Zeitangabe, die Stunde, Minute, Sekunde, Jahr Monat, dom, dow enthält, wobei jedes Element unspezifiziert sein kann, dh "führe es jede Stunde / Minute usw." aus (genau wie crontabs)
  • ein Objekt, das Daten enthält, die dem aufrufenden Objekt mitteilen, was zu tun ist, wenn es vom Scheduler gemeldet wird. Der Scheduler verarbeitet diese Daten nicht, speichert sie nur und gibt sie bei Benachrichtigung zurück.
  • eine Referenz auf das aufrufende Objekt

Beim Start oder nach einer neuen Registrierungsanforderung startet der Scheduler mit einem Calendar-Objekt der aktuellen Systemzeit und prüft, ob Einträge in der Datenbank vorhanden sind, die mit diesem Zeitpunkt übereinstimmen. Wenn dies der Fall ist, werden sie ausgeführt und der Prozess beginnt von vorne. Ist dies nicht der Fall, wird die Zeit im Calendar-Objekt um eine Sekunde erhöht und die Entries werden erneut überprüft. Dies wird wiederholt, bis mindestens ein Eintrag vorhanden ist. (Diskrete Ereignissimulation)

Der Scheduler wird sich dann jede Sekunde an den Zeitstempel erinnern, schlafen und wecken, um zu prüfen, ob er schon da ist. Wenn es aufwacht und die Zeit bereits verstrichen ist, beginnt es wieder, wenn die Zeit gekommen ist und die Jobs ausgeführt wurden.

Bearbeiten : Danke, dass du mich auf Quartz verwiesen hast. Ich suche jedoch etwas viel kleineres.

    
Hanno Fietz 05.03.2009, 10:29
quelle

8 Antworten

4

Wenn Ihre Anforderungen einfach sind, sollten Sie java.util.Timer :

%Vor%

Wie schon notiert wurde , der ExecutorService von java.util.concurrent bietet eine reichere API, wenn Sie sie brauchen.

>     
McDowell 05.03.2009, 12:31
quelle
8

Suche Quarz

    
Miserable Variable 05.03.2009 10:33
quelle
5

Wenn Ihre Objekte genau die einzelnen Zeitpunkte kennen, die sie ausführen möchten, können Sie java.util.concurrent.ScheduledExecutorService verwenden. Dann rufen sie einfach:

%Vor%

Sie müssten nur Quartz verwenden, wenn Sie möchten, dass der Scheduler selbst Funktionen wie "alle 5 Sekunden ausführen" oder komplexes Verhalten um verpasste Ausführungen oder das Fortbestehen des Ausführungs-Audit-Trails behandelt / p>

Sie können die Klasse CronTrigger von Quartz tatsächlich trivial erneut verwenden, um eine "nächste Ausführungszeit" zu erhalten. Die Klasse ist vollständig eigenständig und hängt nicht davon ab, dass sie innerhalb des Quartz "context" aufgerufen wird. Sobald Sie die nächste Ausführungszeit als Date oder long haben, können Sie einfach das Java ScheduledExecutorService wie oben

verwenden     
oxbow_lakes 05.03.2009 11:10
quelle
4

Quarz ist das große und offensichtliche Kraftpaket in diesem Bereich, aber es gibt einige Alternativen zu entdecken.

Cron4j ist eine anständige genug Bibliothek, die etwas leichter ist als Quarz. Es bietet eine gute Dokumentation und wird tun, was Sie wollen.

Wahrscheinlich ist es interessanter, wenn Sie eine Bibliothek verwenden möchten, die besser zu den Parallelbibliotheken von Java (insbesondere Executors und ScheduledExecutors) passt, als HA-JDBC hat eine CronExecutorService -Schnittstelle, die von CronThreadPoolExecutor . Interessanterweise hat es eine Abhängigkeit von Quartz (um die CronExpression-Klasse bereitzustellen), aber ich finde, dass die beiden zusammen besser funktionieren als nur Quartz. Wenn Sie keine großen Abhängigkeiten haben wollen, ist es einfach, die Handvoll Klassen aus Quartz und HA-JDBC zu extrahieren, die dies ermöglichen.

Da Sie etwas viel kleineres möchten (Sie haben nur Ihre Bearbeitung bemerkt), greifen Sie nach CronExpression von Quartz und den zwei oben erwähnten HA-JDBC-Klassen. Das wird es tun.

    
GaryF 05.03.2009 10:58
quelle
1

Ich würde cron4j (bereits erwähnt) über Quartz wärmstens empfehlen, es sei denn, Sie benötigen unbedingt etwas Fortgeschritteneres und Komplexeres Eigenschaften von Quarz. Cron4j konzentriert sich gut darauf, was es tun soll, hat anständige Dokumentation und ist keine Lösung für Küchenspülungen.

    
StaxMan 07.04.2010 06:48
quelle
0

Quartz Scheduler wird normalerweise empfohlen.

    
Marko 05.03.2009 10:35
quelle
0

Ich kann nicht glauben, dass java.util.Timer als Antwort gewählt wurde. Quarz ist wirklich eine viel bessere Wahl.

Ein großer Vorteil von Quarz gegenüber java.util.Timer ist, dass die Jobs mit Quarz in der db gespeichert werden können. Als Ergebnis kann ein jvm planen und ein anderer ausführen. Auch (offensichtlich) überlebt die Anfrage über jvm Neustarts.

    
Pat 07.03.2009 07:54
quelle
0
  

Wahrscheinlich ist es interessanter, wenn Sie eine Bibliothek verwenden möchten, die besser zu den Parallelbibliotheken von Java passt (insbesondere Executors und ScheduledExecutors), dann hat HA-JDBC eine CronExecutorService-Schnittstelle, die von CronThreadPoolExecutor implementiert wird. Interessanterweise hat es eine Abhängigkeit von Quartz (um die CronExpression-Klasse bereitzustellen), aber ich finde, dass die beiden zusammen besser funktionieren als nur Quartz. Wenn Sie keine großen Abhängigkeiten haben wollen, ist es einfach, die Handvoll Klassen aus Quartz und HA-JDBC zu extrahieren, die dies ermöglichen.

Ich wollte nur sagen, dass ich versucht habe, diese Klassen zu extrahieren, und es hat funktioniert! Ich brauchte diese drei Klassen:

  • CronExpression (Quarz)
  • CronThreadPoolExecutor (ha-jdbc)
  • DaemonThreadFactory (ha-jdbc)

Und ich musste nur diese kleinen Verbesserungen machen:

  • Entfernen des Loggers von CronThreadPoolExecutor (er wurde erstellt, aber nie benutzt)
  • Die Konstante YEAR_TO_GIVEUP_SCHEDULING_AT von CronTrigger in CronExpression verschoben

Ich war begeistert, dass ich nicht in einem Gewirr von Abhängigkeiten stecken geblieben bin. Glückwunsch an die Klassenautoren!

Und es hat wie ein Champion funktioniert.

    
Jeanja 11.02.2010 15:57
quelle