3.12Zeitgesteuerte Abläufe
Ein Scheduler arbeitet Programmstücke nach einer festen Zeitspanne oder zu einem fixen Zeitpunkt einmal oder wiederholt ab. Die Notwendigkeit für ein Scheduling gibt es insbesondere im Enterprise-Bereich häufig: In regelmäßigen Abständen müssen Reports erstellt werden, temporäre Daten sollen verschwinden usw. Zwei Scheduling-Technologien sollen kurz vorgestellt werden: die Bibliotheksklasse java.util.Timer und das Scheduling-Framework Quartz.
3.12.1Die Typen Timer und TimerTask
Die Implementierung von zeitgesteuerten Abläufen nimmt uns zum Teil die Java-Bibliothek ab, die dazu die Klassen java.util.Timer und java.util.TimerTask anbietet. Sie helfen bei der zeitgesteuerten Ausführung. Ein TimerTask ist eine Klasse, die uns Runnable implementieren lässt und Operationen umfasst, die zu einem Zeitpunkt oder in einer beliebigen Wiederholung ausgeführt werden sollen. Ein TimerTask wird dann einer Timer-Klasse übergeben, die den dazugehörigen Verwaltungs-Thread startet.
Unser TimerTask soll einfach einen Text auf dem Bildschirm ausgeben:
Listing 3.48com/tutego/insel/thread/timer/TimerTaskDemo.java, Task
@Override public void run() {
System.out.println( "Make my day." );
}
}
Abbildung 3.11Timer und TimerTask
Jetzt müssen wir nur noch dieses TimerTask-Objekt erzeugen und eine der Objektmethoden von Timer übergeben. In unserem Beispiel soll unser Text 2 Sekunden nach dem Eintragen auf dem Bildschirm ausgegeben werden und in einem zweiten Fall – nach einer Wartesekunde – alle 5 Sekunden:
Listing 3.49com/tutego/insel/thread/timer/TimerTaskDemo.java, TimerTaskDemo
public static void main( String[] args ) {
Timer timer = new Timer();
// Start in 2 Sekunden
timer.schedule( new Task(), 2000 );
// Start in 1 Sekunde, dann Ablauf alle 5 Sekunden
timer.schedule( new Task(), 1000, 5000 );
}
}
Die schedule(…)-Methode gibt es in vier Ausführungen. Dazu kommen zwei Methoden namens scheduleAtFixedRate(…), die versuchen, die Genauigkeit zu verbessern. Dies lohnt sich bei Operationen, die über einen langen Zeitraum präziser ohne Drift ausgeführt werden sollen, wie es etwa bei einer Uhr gilt, die jede Stunde ihren großen Zeiger bewegt. Selbst wenn Hintergrundoperationen, wie die Garbage-Collection, die pünktliche Ausführung der Operation verhindern, wird die Verspätung bis zur nächsten Wiederholung aufgeholt.
Ein Timer kann abgebrochen werden, wenn die cancel()-Methode aufgerufen wird.
[»]Hinweis
Insgesamt gibt es drei Timer in Java: java.util.Timer, javax.management.timer.Timer und javax.swing.Timer. Der Management-Timer ist eine TimerMBean und als Managed Bean mit einer ganz besonderen Schnittstelle für Außenstehende zugänglich. Der Swing-Timer führt hingegen keine Task-Objekte aus, sondern ActionListener – und die auch immer im speziellen AWT-Event-Thread.
3.12.2Job-Scheduler Quartz
Der OpenSymphony Quartz Scheduler (http://quartz-scheduler.org/) ist ein hochwertiger Job-Scheduler, der Aufgaben (Jobs) zu bestimmten Zeiten (hier kommt die java.util.Calendar-Klasse ins Spiel) und in gegebener Regelmäßigkeit durchführen kann. Die java.util.Timer-Klasse bietet nur die Angabe einer Startzeit und eines Wiederholungsintervalls. Quartz kann den Zustand der Jobs in einem JobStore speichern, etwa in einer Datenbank (JDBCJobStore), sodass auch nach einem unrühmlichen Ende die Jobs wieder gestartet und weitergeführt werden können. Die Timer-Klasse kann das nicht! Quartz und der Timer sprechen ihre Jobs durch eine Schnittstelle an. Bei Quartz heißt sie Job, und die Callback-Methode execute(…) ruft der Scheduler zu vorgegebenen Zeiten auf. Die zentrale ausführende Einheit erfragt eine statische Fabrikmethode:
Scheduler sched = schedFact.getScheduler();
Die Methode sched.start() startet schließlich den Scheduler. Mit scheduleJob() lässt sich ein Job zusammen mit einem Trigger – das ist eine Beschreibung der Zeitparameter – starten. Eine Dokumentation findet sich auf der Website der Bibliothek und unter http://tutego.de/go/quartzbosanc.