Quarz job

PollerJava

Top Contributor
Hallo,

ich hab mit Spring Quarz jobs noch nie was gemacht, möchte aber jetzt "serien"- emails zu einer gewissen Zeit wegschicken und wenn der Job fertig ausgeführt worden ist, wenn möglich eine Rückmeldung bekommen.
Meine Frage ist jetzt, wie man sowas macht - ich bin mir im klaren, dass das ein weites feld ist, da es wahrscheinlich sehr viele Lösungen dafür gibt (JMS, Spring integration usw.). Mein Ansatz wäre mal - as simple as possible (Wobei, wenn JMS vernünftig wäre für diesen Ansatz, würde ich auch JMS verwenden - aber ich bin mir nicht sicher, ob ich da nicht mir Kanonen auf Spazen schieße - da ich mit
JMS noch nichts gemacht habe - mit Spring Integration ein bisschen was)

Was mir nicht klar ist, wie man mit den Jobs umgeht? Speicher man die in einer
Job- Datenbank und der Quarz fährt dann zyklisch über die Tabelle und schaut, ob ein
Ausführungsdatum eines Jobs fällig ist oder wie kann man das lösen.

Bin dankbar für jede Anregung.

Beste Grüße,
Poller
 
Zuletzt bearbeitet:

turtle

Top Contributor
Quartz kann auf verschiedene Umgebungen konfiguriert werden.

Üblicherweise definiert man einen Job, der periodisch wiederholt laufen soll. Was ich positiv finde, ist, das die Definition wie oft ein Job laufen soll, in cron-kompatibler Weise stattfinden kann.
Also definieren man einen Job, der das Interface org.quartz.Job implementiert:

Java:
public void execute(JobExecutionContext context) throws JobExecutionException {
    JobKey jobKey = context.getJobDetail().getKey();
    _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
}
Dann startet man die "ganze" Machinery.

Java:
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
JobDetail job = newJob(SimpleJob.class)
    .withIdentity("job1", "group1")
    .build();

CronTrigger trigger = newTrigger()
    .withIdentity("trigger1", "group1")
    .withSchedule(cronSchedule("0/20 * * * * ?"))
    .build();


sched.scheduleJob(job, trigger);
Somit läuft der Job alle 20 Sekunden.
Dieser Job wird im RAMJobStore gehalten, was dazu führt, das, sollte die JVM crashen, Informationen zum Job verloren gehen.
Es gibt noch den JDBCJobStore, der die Job-daten in einer Datenbank ablegt.
 

PollerJava

Top Contributor
Danke vielmals für die Antwort, das hat mir schon sehr geholfen.
In meinem Fall möchte ich die Jobs nur einmal ausführen, also ich möchte die Emails (z.B. 5-15) einmal zur gleiche Zeit senden und das wars dann. wenn man in der Applikation dann abermals einen Button klickt, nachdem man eine Zeit eingegeben hat, sollten die Emails wieder zu dieser Zeit gesendet werden - so ist ca. der Usecase.

Läuft die Abhandlung der Jobs eigentlich asynchron oder synchron (Ich vermute mal asynch, wegen dem Scheduler)? Wenn synchron, dann müsste ich das Ganze ja in einen Thread geben, da ich nicht will, dass das Senden der emails meine Web App beeinflusst.

Ein return (Job erfolgreich ausgeführt) muss ich mir wahrscheinlich selber programmieren, da hab ich nicht googeln können.

Vielen Dank und lg
Poller
 

PollerJava

Top Contributor
So, ich hab mich jetzt noch mal beschäftigt mit dem Konzept, wie man das machen könnte - Einer Gruppe von Taxifahrern Emails schreiben.
Mein Konzept würde so aussehen, dass ich eine job Tabelle habe, in dem die IDs stehen, über die ich zu den Infos komme (welche Person und welche Kontaktdaten).

Mittels einer QuartzJobBean (Mein QuartzJob extends QuartzJobBean) hol ich mir aus der Tabelle alle Jobs die ausgeführt werden sollen, führe die Jobs aus und lösche die Jobs dann.
Diese gelöschten Jobs speichere ich dann in eine JobHistory- Tabelle mit dem Status, ob die Kommunikation geklappt hat oder nicht.

Was haltet Ihr von diesem Konzept. Macht das für Euch sinn bzw. was sagt ihr dazu.

Vielen Dank für Info und Bemerkungen.

lg
Poller
 

turtle

Top Contributor
Hört sich im Prinzip gut an...

Die Klasse QuartzJobBean kenne ich nicht.

PS:Kommt von Spring, richtig?

Das wichtigste ist org.quartz.Job. Dieses ist ein Interface mit nur einer Methode (execute). Daher musst du "nur" das Interface implementieren und darin kannst du alles machen, was du möchtest.

Es gibt das Interface JobListener. Darüber informiert Quartz jobToBeExecuted, jobExecutionVetoed und jobWasExecuted. Also weisst du daüber das dein Job fertig ist.

In der JobDataMap kannst du Parameter in den Job reinreichen und wieder ausgeben.
 
Zuletzt bearbeitet:

Neue Themen


Oben