Quartz Scheduler

OnDemand

Top Contributor
Hi zusammen,

hat jemand Erfahrungen mit Quartz? Möchte gern folgendes umsetzen. Was ich so lese klingt als es mit Quartz möglich umzusetzen:

Anforderungen:
Im Programm gibt es verschiedene Jobs, wie Dateien downloaden zu bestimmter Zeit, Datenbank bereinigen in Intervallen, Emails versenden in Intervallen usw

1. User kann im Programm angeben, zu welcher Zeit die Datein heruntergeladen werden soll, zb 10:30 oder alle 20 Minuten (also zu fixer Zeit oder Intervall)
2. Das System soll im Hintergrund (in eigenem Thread) nachts gewisse Logeinträge aus der DB löschen oder Nutzungsdaten an einen Server senden > in Intervallen
3. Nach dem Löschen der Logeinträge usw soll ein "Todo" Sende Mail in eine Tabelle geschrieben werden, ein Quartz Scheduler Job soll da alle 5 Min reinschauen ob es neue Mails zu versenden gibt
4. Alle Intervalle und/oder Uhrzeiten wann ein Job ausgeführt werden muss, soll in einer Datenbank gespeichert sein damit es auch zur Laufzeit geändert werden kann
5. Der Scheduler muss angehalten werden können, um Server zu rebooten etc.
Einzelne Jobs sollen abgebrochen werden können

So wie ich das verstehe, sind die 3 Sachen jeweils ein Quartz-Job. Liesen sich meine Anforderungen damit umsetzen, meine Recherche sagt ja, geht? Möchte aber gern eure Meinung haben, nicht dass ich während der Entwicklung merkr, upps geht doch nicht. Vielleicht gibt es auch noch ein besseres, einfacheres Framework,
 

Oneixee5

Top Contributor
Ich setze Quartz schon seit einigen Jahren ein, dass funktioniert absolut zuverlässig auch über Neustarts hinaus. Bei den DB-Aufgaben kann ich aber so nicht mitgehen. Production-Ready-DB's haben selbst Sceduler und Jobs. Es ist also nicht notwendig DB-Aufgaben auf externe Systeme auszulagern.
 

OnDemand

Top Contributor
Hi, danke für deine Einschätzung. Das mit den Datebanken verstehe ich aber nicht.
Ich möchte in der Datenbank zb eine Tabelle "schedule_times" in der steht wann welcher Job ausgeführt wird.

Quartz soll das beim Start raus holen und so die Jobs konfigurieren. Wenn jemand die Intervalle ändert, muss ich eine Möglichkeit haben um zu sagen "Quartz ändere Job ABC auf Intervall/Uhrzeit xxxx"
 

OnDemand

Top Contributor
Ah achso Mysql Even Scheduler, versteh ja das macht Sinn :) Dann wäre ja Quartz das Framework meiner Wahl und würde alle Anforderungen abdecken. Tip Top :)

Macht so ein Quartzjob seine Aufgaben automatisch in einem separaten Thread? Vermutlich nicht aber dazu lese ich hoffentlich noch mehr, wenn ich mich in das Thema einlese.
 

OnDemand

Top Contributor
Sooo das sieht schon ganz gut aus :)

Nun möchte ich, dass der Kunde im Frontend angibt alle wie viel Minuten oder zu welchem festen Zeitpunkt der Job gemacht werden soll. Den Usern zumuten es im Cronstyle einzugeben ist keine Option. Fixe zeit ist iO dafür hat Quartz eine scheduler Methode.

Interessant wäre wenn der User eingibt zb 5 für alle 5 Minuten und 10:30 für 10:30 Uhr fix jeden Tag und ein "Transformer" die Eingabe zu einem Cron-String umwandelt. Ist einem schon mal so was über den Weg gelaufen?

Öh edit: geht ja ganz einfach, je nach Eingabe des Users wird die entsprechende Methode aufgerufen

Für fix time 10:30
Java:
 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(dailyAtHourAndMinute(10, 30))
    .forJob(myJobKey)
    .build();

Für "alle 5 min"
Java:
trigger = newTrigger()
    .withIdentity("mytrigger", "group1")
    .startNow()
    .withSchedule(simpleSchedule()
            .withIntervalInMinutes(5)
            .repeatForever())
    .build();


Wann ist bei der letzten Variante der Startpunkt? immer zur vollen Stunde also 9:05, 9:10, 9:15 oder je nach dem wann der Scheduler gestartet wird? Wenn er sagen wir 9:12 hoch fährt wäre der erste Ausführungszeitpunk 9:17.
 
Zuletzt bearbeitet:

OnDemand

Top Contributor
Hm das heisst ja wenn der User den Scheduler pausiert und wieder startet ist er "aus dem Takt" beginnt dann also nicht ab der vollen Stunde. Dann müsste man ausrechnen aktuelle Minute bis nächste volle Stunde und dann mit delay starten oder aber mit dem Cron hier sollte es auch immmer von 00 beginnen, alle 5 Min oder 0 0/5 0 * * * ?
 

mrBrown

Super-Moderator
Mitarbeiter
Hm das heisst ja wenn der User den Scheduler pausiert und wieder startet ist er "aus dem Takt" beginnt dann also nicht ab der vollen Stunde. Dann müsste man ausrechnen aktuelle Minute bis nächste volle Stunde und dann mit delay starten oder aber mit dem Cron hier sollte es auch immmer von 00 beginnen, alle 5 Min oder 0 0/5 0 * * * ?
Muss es denn zwingend immer im 00 beginnen?

sinnvoller ist meist, das zu einem zufälligen Zeitpunkt innerhalb des Intervalls beginnen zu lassen, damit verteilt sich die Last etwas besser.
 

OnDemand

Top Contributor
Hier noch ne Frage. Ich habe einen Listener der hört, wenn ein Job fertig ist (danach werden andere Sachen gemacht) Nun ist eine Exception im Job geflogen, aber trotzdem wurde der Job als erledigt markiert, wenn auch nicht erfolgreich.
Hat jemand ne Idee wie ich prüfen kann ob der Job auch erfolgreich erledigt wurde?
 

OnDemand

Top Contributor
Ich setze den context jetzt result on erfolgreich oder nicht, welches ich im listener Auslese.

jemand ne Idee wie ich dem scheduler einen Namen geben kann? Brauch im Projekt noch einen scheduler für system Zeug, die beiden überschreiben sich aber da sie den selben Namen haben 😳
 

Oneixee5

Top Contributor
Es wird normalerweise nur ein Scheduler benötigt. Die Jobs und Trigger haben Namen und können unterschiedliche Aufgaben zu unterschiedlichen Zeitpunkten erledigen. Sollten wirklich Scheduler-Cluster notwendig sein (was auch geht), dann s.: org.quartz.scheduler.instanceId
 

Oneixee5

Top Contributor
Ich setze den context jetzt result on erfolgreich oder nicht, welches ich im listener Auslese.

jemand ne Idee wie ich dem scheduler einen Namen geben kann? Brauch im Projekt noch einen scheduler für system Zeug, die beiden überschreiben sich aber da sie den selben Namen haben 😳
Der Job sollte mögliche Exceptions auffangen und als JobExecutionException weiterleiten. Diese kann dann in einem JobListener ausgewertet werden. http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-07.html
 

Neue Themen


Oben