Java-Bibliothek mit der Klasse zu behandeln, geplante Ausführung von "callbacks"?
Mein Programm hat eine Komponente - genannt der Planer - das können andere Komponenten registrieren, Punkte in der Zeit in der Sie wieder aufgerufen werden. Sollte dies funktionieren ähnlich wie das Unix-cron-Dienst, ich. e. Sie sagen, der Scheduler "Benachrichtigen Sie mich um zehn Minuten nach jeder vollen Stunde".
Ich weiß, es gibt keine echten Rückrufe in Java.
Hier ist mein Ansatz, gibt es eine Bibliothek, die bereits wirkt dieses Zeug? Fühlen Sie sich frei, Vorschläge zur Verbesserung, auch.
Registrieren Aufruf Scheduler übergibt:
- eine Zeitangabe mit Stunden -, Minuten -, Sekunde, Jahr, Monat, dom, dow, wo jeder Punkt kann nicht spezifiziert, was "führen Sie jede Stunde /minute." (genau wie crontabs)
- ein Objekt, das Daten enthält, die einem sagen, das aufrufende Objekt, was zu tun ist, wenn es mitgeteilt wird, durch den Scheduler. Der Scheduler nicht verarbeiten diese Daten, speichert Sie und gibt Sie zurück nach Benachrichtigung.
- eine Referenz auf das aufrufende Objekt
Beim Start, oder nach einer neuen Registrierung verlangen, beginnt der Scheduler mit einem Calendar-Objekt des aktuellen system-Zeit und prüft, ob es irgendwelche Einträge in der Datenbank, passend zu diesem Punkt in der Zeit. Wenn Sie dort sind, werden Sie ausgeführt, und der Prozess beginnt von vorn. Wenn es nicht, die Zeit in der Kalender-Objekt um eins inkrementiert zweite und die entreis werden erneut geprüft. Dies wird wiederholt, bis es einen Eintrag (oder mehr) match(es). (Discrete Event Simulation)
Der Scheduler wird dann merken, dass die timestamp -, sleep-und wake jede Sekunde zu überprüfen, ob es schon da ist. Wenn es geschieht, zu wecken und die Zeit, die bereits vergangen ist, fängt es immer, ebenso, wenn die Zeit gekommen ist, und die Aufträge wurden ausgeführt.
Bearbeiten: Danke für den Hinweis mich an Quartz. Ich bin auf der Suche nach etwas viel kleineres, aber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn sich Ihre Bedürfnisse sind einfach, ziehen Sie die Verwendung java.util.Timer:
Als wurde notiert, die ExecutorService von java.util.gleichzeitige bietet eine umfangreichere API, wenn Sie es brauchen.
Lookup Quarz
Wenn Ihr die Objekte genau wissen, die einzelnen Punkte in der Zeit, die Sie wollen, um ausgeführt zu werden, dann könnte man eine
java.util.concurrent.ScheduledExecutorService
. Dann werden Sie einfach nennen:Würden Sie nur verwenden müssen
Quartz
wenn Sie möchten, dass der scheduler selbst zu handhaben Funktionen wie "ausführen alle 5 Sekunden", oder wenn Sie wollen, dass das komplexe Verhalten um verpasste Hinrichtungen, oder die Beharrlichkeit, mit der die Durchführung audit-trail.Können Sie tatsächlich trivial re-use-Quarz ist
CronTrigger
Klasse zu bekommen, eine "nächste Ausführungszeit". Die Klasse ist völlig eigenständig und hängt nicht aufgerufen wird, innerhalb derQuartz
"Kontext". Sobald Sie die nächste Ausführungszeit alsDate
oderlong
Sie können einfach verwenden Sie die Java -ScheduledExecutorService
wie obenQuarz ist der große und offensichtliche powerhouse in diesem Bereich, aber es gibt einige alternativen zu erkunden.
Cron4j ist genug anständige Bibliothek, das ist ein wenig leichter als Quarz. Es bietet eine gute Dokumentation und werden tun, was Sie wollen.
Wohl mehr interessant ist, wenn Sie verwenden möchten eine library, die passt besser mit der Java-concurrency-Bibliotheken (insbesondere Vollzieher und ScheduledExecutors) dann HA-JDBC hat eine CronExecutorService - Schnittstelle, implementiert durch seine CronThreadPoolExecutor. Nun, interessanterweise, es hat eine Abhängigkeit von Quarz (um die CronExpression-Klasse), aber ich finde, dass die beiden zusammen besser arbeiten als nur Quarz allein. Wenn Sie nicht möchten, dass große Abhängigkeiten, die einfach zu extrahieren, die Handvoll Klassen von Quarz und HA-JDBC, die dies möglich machen.
Da Sie etwas wollen viel kleiner (ist nur aufgefallen, edit), grab CronExpression aus Quarz, und die beiden HA-JDBC-Klassen, die ich oben erwähnt. Das werde es tun.
Ich würde empfehlen cron4j (bereits erwähnt) über Quarz, es sei denn, Sie unbedingt brauchen, einige der fortgeschrittenen und komplexen Funktionen des Quarzes. Cron4j konzentriert sich sehr schön auf, was es tun soll, hat eine anständige Dokumentation, und ist nicht eine Küche-Waschbecken-Lösung.
Quartz scheduler wird in der Regel empfohlen.
Kann nicht glauben, dass java.util.Timer gewählt wurde als die Antwort. Quarz ist wirklich eine viel bessere Wahl.
Einen großen Vorteil von Quarz gegenüber java.util.Timer ist mit Quarz-jobs können gespeichert werden in der db. Als Ergebnis einer jvm können Sie planen und die anderen ausführen kann. Auch (natürlich) der Antrag überlebt über jvm neu gestartet.
Ich wollte nur sagen, dass ich versuchte, das extrahieren dieser Klassen, und es funktionierte! Ich brauchte diese drei Klassen:
Und ich hatte nur zu tun, diese kleinen tweaks:
War ich begeistert, dass ich nicht stecken, ziehen Sie in ein Gewirr von Abhängigkeiten. Herzlichen Glückwunsch an die Klasse Autoren!
Und es ist gearbeitet wie ein Weltmeister.