Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java EE 7: Geschäftsanwendungen

Timer verwenden

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Der Timer-Service der Java EE ermöglicht, dass die Applikation Eingaben von Benutzern entgegennimmt, aber auch im Hintergrund Tätigkeiten ausführen kann.

Transkript

Eine moderne Java-EE-Applikation hat nicht nur die Aufgabe auf Benutzerinteraktionen zu reagieren, sondern sie muss auch bestimmte Tätigkeiten im Hintergrund ausführen können, idealerweise zu bestimmten Zeitpunkten. Dazu wird der Timer-Service verwendet und in diesem Video werden wir uns mit dem Timer-Service auseinandersetzen. Wie werden klären, was der Timer-Service ist, wir er funktioniert und wir werden unsere Applikationen so erweitern, dass sie über ein Timer-Service verfügt, mit dessen Hilfe täglich um 9 Uhr alle Benutzer ermittelt werden können, die an diesen Tag Geburtstag haben. Der Timer-Service selbst wird dazu verwendet, um regelmäßige Callbacks auf Methoden ausführen. Er ist nur Full-Profile verfügbar. Das heißt, Sie müssen darauf achten, wie Sie Ihren Application Server starten, Denn der Standard Startverhalten des Application Servers ist seit der Java EE 6 im Webprofile. Er ist nur auf Ebene von Stateless Session Beans und Singleton Session Beans einsetzbar. Die Callbacks, also die Methodenaufrufe, die automatisiert stattfinden, können dabei unter verschiedenen Gegebenheiten oder Aspekten ablaufen. Zum einen ist es möglich sie zu einer spezifischen Zeit laufen zu lassen, zum anderen können sie nach einer bestimmten Dauer ausgeführt werden oder in angegebenen Intervallen. Diese Callbacks können geplant werden und dafür gibt es verschiedene Möglichkeiten. Zum einen können wir die @Schedule- Annotation auf Methodenebene verwenden. Dann haben wir die Möglichkeit die @Timeout-Annotation zu verwenden oder die TimerService-Klasse einzusetzen. Eine vierte Möglichkeit ist die Verwendung von Deployment-Deskriptoren. Wir werden uns nun im weiteren mit der @Schedule-Annotation befassen, denn diese stellt die einfachste Möglichkeit dar zeitgesteuerte Abläufe zu definieren. Um mit der @Schedule-Annotation sinnvoll arbeiten zu können, müssen wir ausdrücken, wann genau eine Methode ausgeführt werden soll. Wir haben hierbei die Möglichkeit zu sagen, zu welchen Sekunden, Minuten oder Stunden eine Methode aufgerufen werden soll. Die Zahlen sind einigermaßen selbsterklärend, die Angabe des Sternchens steht für jeden möglichen Wert. Ebenfalls sind wir in der Lage ein Wochentag anzugeben. Entweder in der englischen Kurzschreibweise: Sun, Mon, Tue, und so weiter und so fort oder per Ziffern 0-7. 0 und 7 stehen dabei übrigens beides mal für den Sonntag. DayOfMonth erlaubt es uns einen Tag im Monat anzugeben. Selbsterklärend sind die Werte 1-31, wir können aber auch negative Werte angeben und negative Werte meinen dann Tage vor dem Monatsende. Das bedeutet die Angabe von -5 wird im Februar anders ausgewertet werden, als im März. Darüber hinaus können wir auch festlegen, dass etwas am letzten oder am ersten oder zweiten Tag eines Monats laufen soll, mit Angabe von last, first, second, und so weiter und so fort. Die Angabe eines konkreten Monats ist ebenfalls notwendig, beziehungsweise möglich. Hier haben wir die Möglichkeit die Ziffern 1 bis 12 oder die englischen Monatskurznamen zu benutzen. Die Angabe des Sternchen meint jeden Monat. Und beim Jahr haben wir die Möglichkeit eine vierstellige Jahreszahl anzugeben oder ein Sternchen und das Sternchen bedeutet dann jedes Jahr. Es gibt darüber hinaus noch einige spezielle Ausdrücke. Das bereits erwähnte Sternchen steht dabei für jeden möglichen Wert. Ein Komma trennt zwei Werte voneinander und ein Minus erlaubt es uns ein Wertebereich anzugeben. Der Schrägstrich steht für ein Intervall. So meint die Angabe "minute="*/10", jede zehnte Minute. Das bedeutet also, es ist äquivalent mit 10, 20, 30 und so weiter und so fort. "Hour="12/2" meint von 12 ausgehend jede zweite Stunde. das heißt es ist äquivalent mit 12, 14, 16 und so weiter und so fort. Wir werden uns nun damit auseinandersetzen, wie wir unsere Applikation, um eine timergesteuerte Funktionalität erweitern können. Wir fügen nun unserem Projekt eine neue Singleton Session Bean im Package "com.cm.ejb.beans" hinzu. Diese Singleton Session Bean nennt sich "BirthdayNotificationBean". Und sie wird, damit sie eine Singleton Session Bean ist, mit der @Singleton-Annotation versehen, darüber hinaus versehen wir Sie mit der @Startup-Annotation, damit sichergestellt ist, dass der Timer entsprechend auch korrekt initialisiert wird, wenn die Applikation startet. Nun lassen wir uns unser CustomerDAO hier initiieren. Und das machen wir, indem wir eine private Variable anlegen und darüber @EJB-Annotation notieren. Jetzt können wir uns der eigentlichen Implementierung der Methode widmen, die die regelmäßigen Überprüfungen ausführt. Diese Methode nennen wir "checkBirthday()". Und diese Methode annotieren wir mit der @Schedule-Annotation. Bei der @Schedule-Annotation geben wir nun mehr an, dass das Ganze zu einer bestimmten Uhrzeit laufen soll, und zwar mit Hilfe der Eigenschaft "hour" und hier übergeben die Zeichenketten 9. Das bedeutet um 9 Uhr am Morgen. Nun können wir uns die Liste von Customers generieren lassen, die am heutigen Tag Geburtstag haben. Und zwar holen wir die uns aus unserem CustomerDAO, und zwar mit Hilfe der noch nicht existierenden Methode "getCustomersHavingBirthday()". Diese Methode müssen wir nun implementieren, zu diesem Zweck machen wir einen Klick an die Seite und lassen uns den Quickinfo zeigen und wählen dort die Option "Create method' getCustomersHavingBirthday()" aus. Nun müssen wir unsere CustomerBean entsprechenden anpassen, denn in dieser CustomerBean existiert die Methode noch nicht, wir lassen sie also hinzufügen. Wir entscheiden uns hier dazu eine @NamedNativeQuery zu notieren und die notieren wir auf Ebene der Customer Entität. Hier legen wir zunächst einmal einen konstanten Wert an, über den wir die Abfrage, dann identifizieren können. Anschließend können wir die benannte native Abfrage notieren, dies machen wir mit Hilfe der @NamedNativeQuery-Annotation, die Query bekommt den eben angelegten Namen. die Anfrage selber ist eine MySQL-Abfrage, direkt in die Datenbank. Die Rückgabe ist eine Customer Instanz, beziehungsweise es werden in unserem Fall natürlich potenziell mehrere Customer Instanzen sein. Nun können wir zurückwechseln in unsere CustomerBean und uns an die Implementierung der Abfrage selbst machen. Zu diesem Zweck erzeugen wir uns zunächst einmal eine Calendar Instanz, die den heutigen Tag repräsentiert, denn wir suchen, ja, die Geburtstage des heutigen Tages. Danach definieren wir unsere Abfrage und lassen das Ergebnis direkt zurückgeben, wir verwenden dazu die Methode "createNamedQuery" des EntityManagers und geben hier an, dass die eben angelegte Birthdays-Abfrage benutzt wird, die Rückgabe ist von Typ Customer. Und wir setzen nun noch die beiden Parameter, die wir eben definiert haben, nämlich den Tag, das ist der erste Parameter und die holen wir uns aus der Calendar Instanz, mit Hilfe von deren Methode GET und übergeben dabei, dass wir den Tag wollen. Und der zweite Parameter ist dann der Monat, und an den kommen wir ebenfalls über die Methode GET, unter Angabe des Flags MONTH heran. Die Rückgabe lassen wir dann einfach so, wie sie ist, zurückgeben und haben nun eine komplette Abfrage fertiggestellt, mit deren Hilfe wir die Benutzer identifizieren können, die am heutigen Tag Geburtstag haben. Diese Liste benutzen wir jetzt noch nicht, aber die kann dann in späteren Schritten genutzt werden, um beispielsweise eine Nachricht an die entsprechenden Kunden zu senden. In diesem Video haben wir uns mit dem Timer-Service auseinandergesetzt. Wir haben geklärt, wie wir die Ausführung zu bestimmten Uhrzeiten, Stunden, Tagen, Minuten oder an bestimmten Wochen oder Monatstagen festlegen können. Wir haben darüber hinaus auf Ebene der Customer Klasse eine @NamedNativeQuery notiert, die es uns erlaubt, die Benutzer zu identifizieren, die an einem bestimmten Tag und einem bestimmten Monat Geburtstag haben. Darüber hinaus haben wir eine entsprechende Methode in dem CustomerDAO Interface definiert und in der CustomerBean dann implementiert.

Java EE 7: Geschäftsanwendungen

Verfolgen Sie, wie eine komplette Business-Applikation unter dem Einsatz des gesamten Java-Enterprise-Techologiestacks ensteht.

5 Std. 2 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!