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: Web Services

WebSocket

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Mit Hilfe eines WebSockets werden Clients benachrichtigt, wenn sich in der Datenbank etwas geändert hat. Dafür implementieren Sie den eigentlichen WebSocket-Endpoint und stellen per CDI-Event eine Verknüpfung zwischen Datenschicht und WebSocket her.

Transkript

In diesem Video werden wir den serverseitigen WebSocket-Endpoint implementiert. Über diesen kann der DatenLayer mit den Clients der Applikation kommunizieren. Die Aufgabe des WebSockets ist es also, Clients über Änderungen zu informieren. Er befindet sich innerhalb der Webschicht und damit der DataLayer überhaupt mit dem WebSocket kommunizieren kann, weil der DataLayer befindet sich ja eigentlich in der EJB-Schicht, verwenden wir ein CDI-Event und werden auch dieses CDI-Event implementieren und auf die Art und Weise auch eine Verknüpfung zwischen Datenlogik und dem WebSocket herstellen. Und durch diese Verknüpfung dann später die Clients entsprechend informieren können, dass es eine Änderung gegeben hat. Auf die Art und Weise können dann die Javascript-Clients die Daten bei Bedarf neu laden. In meinem WebProjekt werde ich nun zunächst den WebSocket anlegen. Das mache ich wie gesagt in WebProjekt durch einen Rechtsklick aufJava Ressources und dann wähle ich aus dem Kontextmenü New und dann den Eintrag Class aus. Die Klasse nennt sich CustomersWebSocket und das Package ist de.video2brain.clients. So ein WebSocket ist annotiert mit der @ServerEndpoint Annotation und sie verweist auf den Pfad customer. Intern halten wir in einer statischen Liste, da nehmen wir ein Set für, vom Typ Session, die aktiven Sessions der Clients. Und zwar ist das ein synchronisiertes Set. Mit Hilfe der Collections-Class aus dem Java-UT-Package können wir das erreichen und zwar rufen wir da die Methode synchronizedSet auf und darin erzeugen wir eine neue HashSet-Instanz vom Typ Session. Das ganze klingt vielleicht etwas kompliziert und liest sich möglicherweise auch etwas kompliziert, aber am Ende des Tages können wir auf die Art und Weise alle Sessions parallel vorhalten. Nun implementieren wir die WebSocket-Methoden, erste Methode onConnection, da wird uns die Session übergeben und dann fügen wir das zur Sessions-Auflistung einfach hinzu. Die Methode kennzeichnen wir mit der @OnOpen-Annotation. Der Name der Methode ist egal, wichtig ist die Annotation. Zweite Methode ist onDisconnect, auch da wir uns eine Session übergeben und da entfernen wir die Session einfach aus der Sessions-Auflistung mithilfe der remove Methode. Diese Methode wird mit @OnClose annotiert. Auch hier ist der Methodenname egal. Sollte eine Nachricht reinkommen, dann behandeln wir sie in der Methode onMessage. Auch da wird uns eine Session übergeben und eine Nachricht. Und was wir jetzt hier machen ist, wir können alle Sessions benachrichtigen und das machen wir mit Hilfe einer Methode, die wir gleich noch schreiben werden, nämlich notifySessions und da übergeben wir dann die übergebene Nachricht hinein. Diese Methode ist gekennzeichnet mit @OnMessage. So, die Methode notifySessions müssen wir nun noch implementieren, das ist eine private Methode, die bekommt eine Zeichenkette als Parameter und hier werden alle Sessions in der aktuellen Session-Liste durchlaufen und dann einzeln asynchron benachrichtigt, sodass das Ganze nicht blockiert. Das machen wir über die sendText-Methode und da geben wir dann die Nachricht weiter. So, damit ist unser WebSocket soweit fertig und kann genutzt werden. Was nun noch fehlt, ist die Verknüpfung zwischen WebSocket und der CustomerManagementBean, weil beim Aufruf oder beim Durchlaufen der Methoden createCustomer, updateCustomer und deleteCustomer sollen entsprechende Nachrichten an interessierte Clients gesandt werden, und um das zu erreichen, müssen wir einige Schritte gehen. Der erste Schritt besteht darin, dass wir unser EJB-Projekt, falls noch nicht geschehen, dass Sie die IFacet hinzufügen. Dazu machen Sie einen Rechtsklick auf das Projekt, gehen auf die Eigenschaften und klicken dann in diesem großen Eigenschaftsfenster auf Project Facets. Setzen Sie hier das Häkchen bei CDI, achten Sie auf die Version 1.1. Klicken Sie auf Apply und OK und dann wird Ihnen das entsprechende Facet hinzugefügt werden. Nun können wir uns an die Implementierung des EventModels machen. Das Ganze machen wir mithilfe eines CDI-Events, eine Alternative dazu wäre JMS, aber das ist etwas aufwendig, viel einfacher geht es, wenn wir hier ein CDI-Event von der EJB-Schicht in die Webschicht werfen lassen. Zu diesem Zweck legen wir erstmals ein neues Package an, und das Package heißt de.video2brain.customers.events und in diesem Package legen wir nun eine Annotation an und zwar heißt die Annotation CustomerNotification. Diese Annotation kennzeichnen wir erst einmal damit, über die @Retention Annotation, dass sie zur Laufzeit sichtbar ist, das geben wir an über die RetentionPolicy.RUNTIME Sie kann angewandt werden, das drücken wir aus über die @Target Annotation, auf Ebenen von Feldern, auf Ebene von Methoden, auf Ebene von Parametern und auf Ebene von Typen. Das Ganze ist ein Arreyy von diesen Element-Types und wird entsprechend notiert. Und zuletzt geben wir an, dass es sich um einen CDI-Qualifier handelt, das machen wir mit der @Qualifier Annotation aus dem Javax.Package. Das Ganze benötigen wir, damit wir das Event dann über CDI initiieren lassen können und zwar in die auslösende Komponente und damit dann später auch die empfangene Komponente damit arbeiten kann. Der nächste Schritt ist nun das Anlegen der eigentlichen Event-Klasse und das ist eine ganz normale POD-Show, eine ganz normale Java-Klasse, die nennt sich einfach nur CustomerEvent und die ist annotiert mit @Named und mit der eben angelegten @CustomerNotification-Annotation. Hier drin erhalten wir nur eine Nachricht, die wird dann genutzt, um vom Backend zum Frontend übertragen zu werden und von dort aus zu den Clients zu kommen. Lassen Sie uns entsprechende Getter und Setter generieren, und lassen uns darüber auch noch einen Constructor generieren und legen auch noch den Standard-Constructor an. Damit ist das Event als solches fertig implementiert und nun können wir das auf Ebene des DataLayers verwenden. Zu diesem Zweck legen wir uns eine private Variable vom Typ Event und das Event ist ein JavaxEnterprise-Event vom Typ Event CostumerEvent dann, und hier lassen wir uns unser CustomerEvent rein injizieren und drücken dies aus über den @CustomerNotification-Qualifier und die Inject-Annotation. Damit wird CDI diese Instanz dann halt mit Leben befüllen. Und nun können wir, wenn zum Beispiel ein Kunde gespeichert wird, das Event auslösen, und das machen wir, indem wir die Methode fire aufrufen und dann hier eine neue CustomerEvent()-Instanz übergeben und die Nachricht lautet: "Kunde angelegt!". Analog gehen wir nun beim Updaten vor. Da lautet dann die Nachricht: "Kunde bearbeitet!". Und beim Löschen lautet die Nachricht: "Kunde entfernt!". Nun fehlt nur noch auf Ebene des WebSockets die Gegenseite und das ist jetzt hier relativ schnell gemacht, wir definieren nämlich noch eine Methode, und zwar nennen wir die onEvent und hier lassen wir uns die CustomerEvent-Instanz, die gerade eben erzeugt worden ist, geben und rufen dann die definierte Methode notifySessions mit Hilfe der Nachricht, die wir aus diesem Event bekommen, heraus auf. Alles was wir jetzt hier noch angeben müssen, ist die @Observes-Annotation aus dem CDI. Zuletzt fügen wir im Kopf der Seite noch die @Stateless-Annotation ein, damit wird aus diesem WebSocket gleichzeitig eine Stateless Session Bean und CDI erkennt diese Stateless Session Bean und kann dann das Event, was aus der Datenschicht kommt, entsprechend durchreichen. In diesem Video haben wir uns mit der Implementierung des WebSockets befasst und wir haben unseren DataLayer so angepasst, dass er ein Event an den WebSocket schicken kann, der WebSocket wird dieses Event dann an die interessierten Clients weiterleiten und somit haben wir eine Möglichkeit geschaffen, dass von der Datenlogik her eine Nachricht an die HTML- und Java-Script-Clients gesandt werden kann.

Java EE 7: Web Services

Steigen Sie ein in die Java-Enterprise-Welt und lernen Sie, wie Nachrichten ausgetauscht und Dienste definiert werden.

5 Std. 13 min (30 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!