SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Rufen Sie uns nicht an, wir rufen Sie an!
Server-Sent Events und WebSockets im Java Enterprise Umfeld
Sebastian Reiners
open knowledge GmbH
Inhalt
1. HTTP: Wer nicht fragt bleibt dumm
2. Alternative Ansätze
3. Server-Sent Events
4. WebSockets
5. Probleme beim Einsatz mit JavaEE
6. Fazit
Funktionsweise von HTTP
• Klassische Funktionsweise des Web:
1. Client stellt Anfrage an Server
2. Server verarbeitet Anfrage
3. Server schickt Antwort
4. Client verarbeitet Antwort
• Motto: Wer nicht fragt bleibt dumm.
<= Request
<= Response
Funktionsweise von HTTP
• Standard-Verhalten, seit es HTTP gibt (seit 1991)
• Dokumenten-basiert
• ein Request => ein neues Dokument
• zugeschnitten auf damaligen Verwendungszweck
• Austausch von Dokumenten
>
Es kommt Bewegung rein
• sehr starres Konstrukt
• Dynamik? 
• Wechsel von Dokumenten zu Anwendungen im Web
• zunächst mit synchroner Verarbeitung
• nächster, großer Schritt: Auflockern des
Request/Response Cycles
• unterstützt durch clientseitige Skript-Sprache
• Asynchronous JavaScript and XML
Asynchrone Requests
• Auflockern, noch kein Aufbrechen
• lösen vom dokumenten-basierten Ansatz
• Übertragung von
• ... Teildokumenten
• ... dokumentenunabhängiger Information
• 1998 durch Microsoft angestoßen worden
• 2006 durch W3C standardisiert als XMLHttpRequest
Asynchrone Requests
• Vorteile asynchroner Requests:
• mehr Dynamik in Webseiten
• geringeres Datenvolumen im Transport
• Loslösung von reiner Formularverarbeitung
• Es ist aber immer noch das Request/Response Prinzip!
Asynchrone Requests
• in vielen Fällen immer noch unpraktisch
• Was ist bei Änderungen auf Serverseite?
• Änderungen können erst bei nächster Anfrage mitgeteilt
werden.
• zeitliche Verzögerung
Welche Ansätze gibt es?
• zeitlich getaktet, immer wieder beim Server anfragen
• Wie kurz takte ich?
• über Applets
• Longpolling
• Grundlage: langlaufende Requests
• wiederholter, erneuter Aufbau
Welche Ansätze gibt es?
• Nachteile:
• haben Sicherheitsprobleme
• holprige Integration mit dem Rest der Seite
• benötigen ein weiteres Protokoll, aufsetzend auf HTTP
• Skalierungsprobleme
Wäre doch schön wenn ...
... der Server von sich aus
Bescheid sagen könnte.
Server-Sent Events und WebSockets
• beides standardisiert durch das W3C
• beides in Java Webanwendungen einsetzbar
• Server-Sent Events: unidirektional
• über eine HTTP Connection
• WebSockets: bidirektional
• über eine Socket-Verbindung
Server-Sent Events
• Client "registriert" sich beim Server
• kann danach vom Server "Events" empfangen
• Event-Nachrichten haben ein bestimmtes Format:
event:addn
data:1500n
data:600n
n
• Übermittlung mittels HTTP
Server-Sent Events
• in vielerlei Hinsicht ähnlich zu Longpolling Verfahren
• allerdings fehlender Ab-/Aufbau der Verbindung
• gut geeignet für beständige Aktualisierungen
• Aktienkurse
• Newsfeeds
• wann immer der Client lange warten müsste
Server-Sent Events - Client
var source = new EventSource('/sse_xyz');
source.onmessage = function(event) {
if (event.type === 'add') {
...
} else if (event.type === 'remove') {
...
}
}
...
source.close();
Server-Sent Events - Server
• Gibt es einen JSR für Server-Sent Events?
• Nein, brauchen wir aber auch nicht. 
• Die Standard Servlet API ist bereits vollkommen
ausreichend.
Server-Sent Events - Server
@WebServlet(urlPatterns={"/sse_xyz"})
public class SSEServlet extends HttpServlet {
@Override
protected void doGet( HttpServletRequest req,
HttpServletResponse res)
throws IOException, ServletException {
res.setContentType("text/event-stream");
res.setCharacterEncoding("UTF-8");
PrintWriter writer = res.getWriter();
...
writer.write("data: " + msg + "nn");
writer.flush();
}
}
Server-Sent Events
• möglich mit jedem Servlet-Container
• keine Unterstützung durch IE / Edge
• bringen u.U. Skalierungsprobleme mit sich
WebSockets
• bidirektionale Kommunikation
• sowohl Client als auch Server können selbstständig
Nachrichten schicken
• Client "registriert" sich beim Server
• Request über "ws://" bzw. "wss://"
• Handshake über HTTP
• Danach eigentlicher Protokollwechsel
WebSocket - Handshake
GET /chat/connect HTTP/1.1
Host: localhost:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Sec-WebSocket-Version: 13
Origin: http://localhost:8080
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: M+Le93PunXLSl33Vpip98Q==
Connection: keep-alive, Upgrade
Upgrade: websocket
WebSocket - Handshake
HTTP/1.1 101 Switching Protocols
Origin: http://localhost:8080
Upgrade: WebSocket
Sec-WebSocket-Accept: zH6VNxS6o1H/X1ZRqv4a213BanQ=
Connection: Upgrade
Sec-WebSocket-Location: ws://localhost:8080/chat/connect
Content-Length: 0
WebSockets
• die mächtigste der hier vorgestellten
Kommunikationsarten
• kann alles erfüllen, was über Server-Sent Events möglich
ist
• hat einen zusätzlichen Kanal für Nachrichten des Clients
• gut geeignet für:
• Chats
• Collaboration-Tools
WebSockets – JavaScript Client
var socket = new WebSocket("ws://host:8080/path/");
socket.onopen = function(event) {...}
socket.onmessage = function(event) {
alert("Received message: "+event.data);
}
socket.onclose = function(event) {...}
socket.send("Message-Inhalt");
...
socket.close();
WebSockets - Serverseite
• Gibt es dazu einen JSR? (Oder braucht man ihn hier
auch nicht?)
• Ja, gibt es. JSR 356
• Seit Java EE 7 verfügbar
• Server-Support:
• Glassfish 4
• Wildfly 8
• Jetty 9.1
• ...
WebSockets - Serverseite
• WebSocket Unterstützung schon vor JSR
• große Unterschiede in der Umsetzung
• sehr rudimentär: Glassfish
• sehr weit fortgeschritten Jetty
• Umsetzung des JSR => Jetty-Version +
• Ein-/Ausgabe Konverter
• Standardisierte Schnittstelle zum Versand von Text,
Binärdaten, usw.
WebSockets - Serverseite
• Wie funktioniert das denn nun?
• Zwei Ansätze:
• Interface-basiert
• Annotation-basiert
WebSockets - Serverseite
• (nahezu) beliebige POJOs als Endpoint
• @ServerEndpoint("/pathForEndpoint")
• @OnOpen an Methoden für Verbindungsaufbau
• mit folgender Signatur:
public void method(Session session,
EndpointConfig cfg,
@PathParam(...) String param)
WebSockets - Serverseite
• @OnClose an Methoden für Verbindungsabbau
• mit folgender Signatur:
public void method(Session session,
CloseReason reason,
@PathParam(...) String param)
WebSockets - Serverseite
• @OnMessage an Methode, die auf Client-Nachrichten
reagieren soll
• Signatur
public void method([Variiert] message,
Session session,
@PathParam(...) String param)
WebSockets - Serverseite
• Für Textnachrichten:
• String, Java Primitives
• Reader
• Für Binärnachrichten:
• byte[],
• ByteBuffer
WebSockets – Ein einfaches Beispiel
• Genug Theorie ;-)
• Angenommen wir wollen folgenden Service schreiben:
• Erreichbar unter
ws://hostname:8080/chat/upper
• Texte die hingeschickt werden, sollen Uppercase an alle
Clients weitergeleitet werden, die verbunden sind
WebSockets – Ein einfaches Beispiel
@ServerEndpoint("/upper")
public class MySocketEndpoint {
@OnOpen
public void open(Session newSession) {
System.out.println("Open:"+newSession.getId());
}
@OnClose
public void close(Session closedSession) {
System.out.println("Close:"+closedSession.getId());
}
WebSockets – Ein einfaches Beispiel
@OnMessage
public void sendUpper(String message, Session se) {
for(Session session : se.getOpenSessions()) {
try {
session.getBasicRemote()
.sendText(message.toUpperCase());
} catch (IOException | EncodeException e) {
// Error handling
}
}
}
}
WebSockets – Abseits von Text und Bytes
• Was wenn ich nicht auf Text- oder Binärdaten arbeiten
will?
• Decoder und Encoder um Ein- und Ausgabedaten in ein
eigenes Objektmodell umzuwandeln
• Bereitgestellte Interfaces:
• Decoder.Text, Decoder.Binary
• Encoder.Text, Encoder.Binary
Abseits von Text und Bytes - Encoder
public interface Encoder {
void init(EndpointConfig var);
void destroy();
[...]
public interface Text<T> extends Encoder {
String encode(T var) throws EncodeException;
}
}
Abseits von Text und Bytes - Decoder
public interface Decoder {
void init(EndpointConfig var);
void destroy();
[...]
public interface Text<T> extends Decoder {
T decode(String var) throws DecodeException;
boolean willDecode(String var);
}
}
WebSockets – Abseits von Text und Bytes
public class Converter implements Decoder.Text<Message>,
Encoder.Text<Message> {
public void destroy() {...}
public void init(EndpointConfiguration conf) {...}
public Message decode(String messageStr) {...}
public String encode(Message message) {...}
public boolean willDecode(String messageStr) {...}
}
WebSockets – Abseits von Text und Bytes
• Wie geschieht die Anbindung an den Endpoint?
@ServerEndpoint(value="/endpoint",
encoders=Converter.class,
decoders=Converter.class)
@OnMessage
public void handleMessage(Message m, Session s) {
for(Session session : s.getOpenSessions()) {
session.getBasicRemote().sendObject(m);
}
}
WebSockets – Ist das schon alles?
• Streaming-Unterstützung
• Encoder.TextStream, Decoder.TextStream
• Reader bzw. Writer
• Encoder.BinaryStream,
Decoder.BinaryStream
• InputStream bzw. OutputStream
WebSockets – Ist das schon alles?
• Pfad-Parameter
• ähnlich wie man es aus REST APIs gewohnt ist
@ServerEndpoint("path/{param}/endpoint")
@OnMessage
public void onMessage(String s,
@PathParam("param") String par,
Session session) {...}
WebSockets – Ist das schon alles?
• Java-Client:
@ClientEndpoint
public class WebsocketClientEndpoint {
private MessageHandler messageHandler;
public WebsocketClientEndpoint(URI endpointURI) {
try {
WebSocketContainer container =
ContainerProvider.getWebSocketContainer();
container.connectToServer(this, endpointURI);
} catch (Exception e) {...}
}
Einsetzbarkeit im Java EE Bereich
Okay ... Möglich ist das alles ...
Aber geht das auch wirklich gut?
Einsetzbarkeit im Java EE Bereich
• Server-Sent Events:
• ältere, bewährte Technologie-Basis
• Technologie immer noch Grundlage vieler neuer APIs
• keine letztendliche Integration mit JSF
• keine Unterstützung durch Internet Explorer
• auch nicht in neuen Versionen
Einsetzbarkeit im Java EE Bereich
• WebSockets:
• neuer JSR
• Unterstützung durch alle neueren Browser
• ggf. Alternative zu SSEs für Internet Explorer
• keine letztendliche Integration mit JSF
• unvollständige Integration mit CDI
Wo ist das Problem mit CDI?
@ServerEndpoint("/ws_connect")
public class MyEndpoint {
@Inject
@SessionScoped
private MySessionObject mso;
...
org.jboss.weld.context.ContextNotActiveException:
WELD-001303 No active contexts for scope
type javax.enterprise.context.SessionScoped
Wo ist das Problem mit CDI?
• Warum nicht aktiv? Wir haben doch eine Session ... Ô_ó
• Ja, aber ...
• im Web-Container gebunden an HTTP-Session
• WebSockets haben eigene Sessions, da nicht mehr
HTTP
• Komme ich irgendwie an die HTTP-Session ran?
• Ja, wir haben ja den anfänglichen Handshake!
Die ServerEndpoint Konfiguration
public class SessionAccessConfig extends
ServerEndpointConfig.Configurator {
@Override
public void modifyHandshake(ServerEndpointConfig cfg,
HandshakeRequest request,
HandshakeResponse response) {
HttpSession session = (HttpSession) request.getHttpSession();
cfg.getUserProperties().put("httpSession", session);
}
}
Die ServerEndpoint Konfiguration
@ServerEndpoint(value="/upper",
configurator=SessionAccesConfig.class)
public class MySocketEndpoint {
private String valueFromHttpSession = null;
@OnOpen
public void open(Session newSession, EndpointConfig cfg) {
HttpSession httpSes = (HttpSession)cfg.getUserProperties
.get("httpSession");
valueFromHttpSession = httpSes.getAttribute("xyz");
}
...
}
Was bringt mir das alles?
• stärkeres "Feeling" einer Desktopanwendung
• zunächst immenser Geschwindigkeitsgewinn
• höher, je mehr Nachrichten
• bis zu 400% höher
• relativiert sich, beim Einsatz "in freier Natur"
• Netzlatenzen (lediglich 10% bis 25%)
Fazit
• WebSockets und Server-Sent Events in modernen
JavaEE Umgebungen einsetzbar
• schwer mit JSF und CDI integrierbar
• problemlos für kleine, losgelöste Features
• als Anwendungs-Grundlage: Umdenken erforderlich
Fazit
• beides wird nicht "die Welt verändern"
• Server-Sent Events:
• mangelnde Unterstützung durch IE
• WebSockets:
• häufig wird man gerade auf CDI nicht verzichten wollen
• Low-Level Protokoll
Fazit
• sind eine interessante Ergänzung
• läuft neben klassischen Enterprise Anwendungen
• wenn es auf Geschwindigkeit ankommt unschätzbar
• sorgen für einen intuitiveren Ablauf von Kommunikation
"Rufen Sie nicht den Server an, der Server ruft Sie an!"
Fragen?
Vielen Dank
Sebastian Reiners
open knowledge GmbH
www.openknowledge.de
facebook.com/openknowledge
twitter.com/_openknowledge

Weitere ähnliche Inhalte

Was ist angesagt?

Skalieren von Rails Anwendungen mit Amazon S3 und EC2
Skalieren von Rails Anwendungen mit Amazon S3 und EC2Skalieren von Rails Anwendungen mit Amazon S3 und EC2
Skalieren von Rails Anwendungen mit Amazon S3 und EC2Jonathan Weiss
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbargedoplan
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch CachingAOE
 
Powerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-FeaturesPowerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-FeaturesSascha Hameister
 
Webanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnWebanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnRoman Roelofsen
 
Introduction to BlazeDS
Introduction to BlazeDSIntroduction to BlazeDS
Introduction to BlazeDSawerft
 
HTML5 Storage
HTML5 StorageHTML5 Storage
HTML5 Storageadesso AG
 
Infonova Devopscon München 2015
Infonova Devopscon München 2015Infonova Devopscon München 2015
Infonova Devopscon München 2015Georg Öttl
 
Malte Wessel - Google web toolkit
Malte Wessel - Google web toolkitMalte Wessel - Google web toolkit
Malte Wessel - Google web toolkitdrbreak
 
Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"schellsoft
 
Enter the WebMatrix
Enter the WebMatrixEnter the WebMatrix
Enter the WebMatrixMartin Hey
 
Yes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-EntwicklerYes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-EntwicklerGregor Biswanger
 

Was ist angesagt? (16)

Skalieren von Rails Anwendungen mit Amazon S3 und EC2
Skalieren von Rails Anwendungen mit Amazon S3 und EC2Skalieren von Rails Anwendungen mit Amazon S3 und EC2
Skalieren von Rails Anwendungen mit Amazon S3 und EC2
 
Dockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloudDockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloud
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbar
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch Caching
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
Powerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-FeaturesPowerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-Features
 
Webanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnWebanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickeln
 
desktop4education - AINAC Wien
desktop4education - AINAC Wiendesktop4education - AINAC Wien
desktop4education - AINAC Wien
 
Introduction to BlazeDS
Introduction to BlazeDSIntroduction to BlazeDS
Introduction to BlazeDS
 
HTML5 Storage
HTML5 StorageHTML5 Storage
HTML5 Storage
 
Infonova Devopscon München 2015
Infonova Devopscon München 2015Infonova Devopscon München 2015
Infonova Devopscon München 2015
 
Malte Wessel - Google web toolkit
Malte Wessel - Google web toolkitMalte Wessel - Google web toolkit
Malte Wessel - Google web toolkit
 
Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Enter the WebMatrix
Enter the WebMatrixEnter the WebMatrix
Enter the WebMatrix
 
Yes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-EntwicklerYes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-Entwickler
 

Andere mochten auch

Präs wtw 6.7.2011
Präs wtw 6.7.2011Präs wtw 6.7.2011
Präs wtw 6.7.2011buggzzy
 
Basiswissen hsp rsp
Basiswissen hsp rspBasiswissen hsp rsp
Basiswissen hsp rspkkreienbrink
 
Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...
Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...
Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...GERMAN RACING Concept Challenge
 
De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.
De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.
De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.HAGELE kantoormeubilair
 
Insectissima - Trudys Tag
Insectissima - Trudys TagInsectissima - Trudys Tag
Insectissima - Trudys TagFreekidstories
 
Eine kleine praktische Philosophie über das Requirements Engineering
Eine kleine praktische Philosophie über das Requirements EngineeringEine kleine praktische Philosophie über das Requirements Engineering
Eine kleine praktische Philosophie über das Requirements Engineeringadesso AG
 
Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014dankl+partner consulting gmbh
 
Manual de Montaje del Hotbodies D8
Manual de Montaje del Hotbodies D8Manual de Montaje del Hotbodies D8
Manual de Montaje del Hotbodies D8sergi97
 
Präsentation wieser
Präsentation wieserPräsentation wieser
Präsentation wieserLaura Theunis
 
Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014dankl+partner consulting gmbh
 

Andere mochten auch (20)

TPM-Lehrgang 2015 - Total Productive Maintenance
TPM-Lehrgang 2015 - Total Productive MaintenanceTPM-Lehrgang 2015 - Total Productive Maintenance
TPM-Lehrgang 2015 - Total Productive Maintenance
 
Präs wtw 6.7.2011
Präs wtw 6.7.2011Präs wtw 6.7.2011
Präs wtw 6.7.2011
 
Farmacotécnica de fitoterapicos
Farmacotécnica de fitoterapicosFarmacotécnica de fitoterapicos
Farmacotécnica de fitoterapicos
 
Meg 1
Meg 1Meg 1
Meg 1
 
Tech int1 1
Tech int1 1Tech int1 1
Tech int1 1
 
ET
ETET
ET
 
Basiswissen hsp rsp
Basiswissen hsp rspBasiswissen hsp rsp
Basiswissen hsp rsp
 
Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...
Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...
Final-Präsentation GERMAN RACING Concept Challenge 2013 – 3. Platz "HHL Consu...
 
Binder1
Binder1Binder1
Binder1
 
De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.
De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.
De Lounge Chair van Eric Magnussen, bij HAGELE kantoormeubilair.
 
Überzeugt!
Überzeugt! Überzeugt!
Überzeugt!
 
Insectissima - Trudys Tag
Insectissima - Trudys TagInsectissima - Trudys Tag
Insectissima - Trudys Tag
 
Eine kleine praktische Philosophie über das Requirements Engineering
Eine kleine praktische Philosophie über das Requirements EngineeringEine kleine praktische Philosophie über das Requirements Engineering
Eine kleine praktische Philosophie über das Requirements Engineering
 
Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014
 
Food 2
Food 2Food 2
Food 2
 
Manual de Montaje del Hotbodies D8
Manual de Montaje del Hotbodies D8Manual de Montaje del Hotbodies D8
Manual de Montaje del Hotbodies D8
 
Free englishgrammar
Free englishgrammarFree englishgrammar
Free englishgrammar
 
Irm basics
Irm   basicsIrm   basics
Irm basics
 
Präsentation wieser
Präsentation wieserPräsentation wieser
Präsentation wieser
 
Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014Trainings für Instandhaltung und Produktion - Termine 2014
Trainings für Instandhaltung und Produktion - Termine 2014
 

Ähnlich wie Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets im Java EE-Umfeld

Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsStefan Adolf
 
Internet Information Services (deutsch)
Internet Information Services (deutsch)Internet Information Services (deutsch)
Internet Information Services (deutsch)Joerg Krause
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Dirk Ginader
 
Avoid Network-Issues and Polling
Avoid Network-Issues and PollingAvoid Network-Issues and Polling
Avoid Network-Issues and PollingKai Donato
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAsQAware GmbH
 
Reaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaReaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaMarkus Klink
 
Sockets – Theorie und Implementierung
Sockets – Theorie und ImplementierungSockets – Theorie und Implementierung
Sockets – Theorie und ImplementierungAndreas Roth
 
Pimp My SharePoint - Performanceprobleme vorbeugen, analysieren und beheben
Pimp My SharePoint - Performanceprobleme vorbeugen, analysieren und behebenPimp My SharePoint - Performanceprobleme vorbeugen, analysieren und beheben
Pimp My SharePoint - Performanceprobleme vorbeugen, analysieren und behebenDavid Schneider
 
HTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungHTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungChristian Baranowski
 
Sockets – Theorie und Implementierung
Sockets – Theorie und ImplementierungSockets – Theorie und Implementierung
Sockets – Theorie und ImplementierungAndreas Roth
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashStephan Schmidt
 
WebSocket my APEX!
WebSocket my APEX!WebSocket my APEX!
WebSocket my APEX!Kai Donato
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere RESTMartin Abraham
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Daniel Havlik
 
Herausforderung „Multi-Channel“-Architektur
Herausforderung „Multi-Channel“-ArchitekturHerausforderung „Multi-Channel“-Architektur
Herausforderung „Multi-Channel“-ArchitekturOPEN KNOWLEDGE GmbH
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 

Ähnlich wie Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets im Java EE-Umfeld (20)

Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
 
Internet Information Services (deutsch)
Internet Information Services (deutsch)Internet Information Services (deutsch)
Internet Information Services (deutsch)
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010
 
JSF vs. GWT? JSF und GWT!
JSF vs. GWT? JSF und GWT!JSF vs. GWT? JSF und GWT!
JSF vs. GWT? JSF und GWT!
 
GWT
GWTGWT
GWT
 
Avoid Network-Issues and Polling
Avoid Network-Issues and PollingAvoid Network-Issues and Polling
Avoid Network-Issues and Polling
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Reaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaReaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und Akka
 
Sockets – Theorie und Implementierung
Sockets – Theorie und ImplementierungSockets – Theorie und Implementierung
Sockets – Theorie und Implementierung
 
Pimp My SharePoint - Performanceprobleme vorbeugen, analysieren und beheben
Pimp My SharePoint - Performanceprobleme vorbeugen, analysieren und behebenPimp My SharePoint - Performanceprobleme vorbeugen, analysieren und beheben
Pimp My SharePoint - Performanceprobleme vorbeugen, analysieren und beheben
 
Web-API Design in Java
Web-API Design in JavaWeb-API Design in Java
Web-API Design in Java
 
HTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungHTTP und Java Servlets Programmierung
HTTP und Java Servlets Programmierung
 
Sockets – Theorie und Implementierung
Sockets – Theorie und ImplementierungSockets – Theorie und Implementierung
Sockets – Theorie und Implementierung
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit Flash
 
WebSocket my APEX!
WebSocket my APEX!WebSocket my APEX!
WebSocket my APEX!
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere REST
 
Typo3 und Varnish
Typo3 und VarnishTypo3 und Varnish
Typo3 und Varnish
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
Herausforderung „Multi-Channel“-Architektur
Herausforderung „Multi-Channel“-ArchitekturHerausforderung „Multi-Channel“-Architektur
Herausforderung „Multi-Channel“-Architektur
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 

Mehr von OPEN KNOWLEDGE GmbH

Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIWarum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIOPEN KNOWLEDGE GmbH
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationOPEN KNOWLEDGE GmbH
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. OPEN KNOWLEDGE GmbH
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenOPEN KNOWLEDGE GmbH
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsOPEN KNOWLEDGE GmbH
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten SystemenOPEN KNOWLEDGE GmbH
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungOPEN KNOWLEDGE GmbH
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingOPEN KNOWLEDGE GmbH
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusOPEN KNOWLEDGE GmbH
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!OPEN KNOWLEDGE GmbH
 

Mehr von OPEN KNOWLEDGE GmbH (20)

Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIWarum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
 
Nie wieder Log-Files!
Nie wieder Log-Files!Nie wieder Log-Files!
Nie wieder Log-Files!
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud.
 
API Expand Contract
API Expand ContractAPI Expand Contract
API Expand Contract
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten Architekturen
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.js
 
KI und Architektur
KI und ArchitekturKI und Architektur
KI und Architektur
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale Netze
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten Systemen
 
Business-Mehrwert durch KI
Business-Mehrwert durch KIBusiness-Mehrwert durch KI
Business-Mehrwert durch KI
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch Automatisierung
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und Testing
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: Quarkus
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!
 

Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets im Java EE-Umfeld

  • 1. Rufen Sie uns nicht an, wir rufen Sie an! Server-Sent Events und WebSockets im Java Enterprise Umfeld Sebastian Reiners open knowledge GmbH
  • 2. Inhalt 1. HTTP: Wer nicht fragt bleibt dumm 2. Alternative Ansätze 3. Server-Sent Events 4. WebSockets 5. Probleme beim Einsatz mit JavaEE 6. Fazit
  • 3. Funktionsweise von HTTP • Klassische Funktionsweise des Web: 1. Client stellt Anfrage an Server 2. Server verarbeitet Anfrage 3. Server schickt Antwort 4. Client verarbeitet Antwort • Motto: Wer nicht fragt bleibt dumm. <= Request <= Response
  • 4. Funktionsweise von HTTP • Standard-Verhalten, seit es HTTP gibt (seit 1991) • Dokumenten-basiert • ein Request => ein neues Dokument • zugeschnitten auf damaligen Verwendungszweck • Austausch von Dokumenten >
  • 5. Es kommt Bewegung rein • sehr starres Konstrukt • Dynamik?  • Wechsel von Dokumenten zu Anwendungen im Web • zunächst mit synchroner Verarbeitung • nächster, großer Schritt: Auflockern des Request/Response Cycles • unterstützt durch clientseitige Skript-Sprache • Asynchronous JavaScript and XML
  • 6. Asynchrone Requests • Auflockern, noch kein Aufbrechen • lösen vom dokumenten-basierten Ansatz • Übertragung von • ... Teildokumenten • ... dokumentenunabhängiger Information • 1998 durch Microsoft angestoßen worden • 2006 durch W3C standardisiert als XMLHttpRequest
  • 7. Asynchrone Requests • Vorteile asynchroner Requests: • mehr Dynamik in Webseiten • geringeres Datenvolumen im Transport • Loslösung von reiner Formularverarbeitung • Es ist aber immer noch das Request/Response Prinzip!
  • 8. Asynchrone Requests • in vielen Fällen immer noch unpraktisch • Was ist bei Änderungen auf Serverseite? • Änderungen können erst bei nächster Anfrage mitgeteilt werden. • zeitliche Verzögerung
  • 9. Welche Ansätze gibt es? • zeitlich getaktet, immer wieder beim Server anfragen • Wie kurz takte ich? • über Applets • Longpolling • Grundlage: langlaufende Requests • wiederholter, erneuter Aufbau
  • 10. Welche Ansätze gibt es? • Nachteile: • haben Sicherheitsprobleme • holprige Integration mit dem Rest der Seite • benötigen ein weiteres Protokoll, aufsetzend auf HTTP • Skalierungsprobleme
  • 11. Wäre doch schön wenn ... ... der Server von sich aus Bescheid sagen könnte.
  • 12. Server-Sent Events und WebSockets • beides standardisiert durch das W3C • beides in Java Webanwendungen einsetzbar • Server-Sent Events: unidirektional • über eine HTTP Connection • WebSockets: bidirektional • über eine Socket-Verbindung
  • 13. Server-Sent Events • Client "registriert" sich beim Server • kann danach vom Server "Events" empfangen • Event-Nachrichten haben ein bestimmtes Format: event:addn data:1500n data:600n n • Übermittlung mittels HTTP
  • 14. Server-Sent Events • in vielerlei Hinsicht ähnlich zu Longpolling Verfahren • allerdings fehlender Ab-/Aufbau der Verbindung • gut geeignet für beständige Aktualisierungen • Aktienkurse • Newsfeeds • wann immer der Client lange warten müsste
  • 15. Server-Sent Events - Client var source = new EventSource('/sse_xyz'); source.onmessage = function(event) { if (event.type === 'add') { ... } else if (event.type === 'remove') { ... } } ... source.close();
  • 16. Server-Sent Events - Server • Gibt es einen JSR für Server-Sent Events? • Nein, brauchen wir aber auch nicht.  • Die Standard Servlet API ist bereits vollkommen ausreichend.
  • 17. Server-Sent Events - Server @WebServlet(urlPatterns={"/sse_xyz"}) public class SSEServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/event-stream"); res.setCharacterEncoding("UTF-8"); PrintWriter writer = res.getWriter(); ... writer.write("data: " + msg + "nn"); writer.flush(); } }
  • 18. Server-Sent Events • möglich mit jedem Servlet-Container • keine Unterstützung durch IE / Edge • bringen u.U. Skalierungsprobleme mit sich
  • 19. WebSockets • bidirektionale Kommunikation • sowohl Client als auch Server können selbstständig Nachrichten schicken • Client "registriert" sich beim Server • Request über "ws://" bzw. "wss://" • Handshake über HTTP • Danach eigentlicher Protokollwechsel
  • 20. WebSocket - Handshake GET /chat/connect HTTP/1.1 Host: localhost:8080 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Sec-WebSocket-Version: 13 Origin: http://localhost:8080 Sec-WebSocket-Extensions: permessage-deflate Sec-WebSocket-Key: M+Le93PunXLSl33Vpip98Q== Connection: keep-alive, Upgrade Upgrade: websocket
  • 21. WebSocket - Handshake HTTP/1.1 101 Switching Protocols Origin: http://localhost:8080 Upgrade: WebSocket Sec-WebSocket-Accept: zH6VNxS6o1H/X1ZRqv4a213BanQ= Connection: Upgrade Sec-WebSocket-Location: ws://localhost:8080/chat/connect Content-Length: 0
  • 22. WebSockets • die mächtigste der hier vorgestellten Kommunikationsarten • kann alles erfüllen, was über Server-Sent Events möglich ist • hat einen zusätzlichen Kanal für Nachrichten des Clients • gut geeignet für: • Chats • Collaboration-Tools
  • 23. WebSockets – JavaScript Client var socket = new WebSocket("ws://host:8080/path/"); socket.onopen = function(event) {...} socket.onmessage = function(event) { alert("Received message: "+event.data); } socket.onclose = function(event) {...} socket.send("Message-Inhalt"); ... socket.close();
  • 24. WebSockets - Serverseite • Gibt es dazu einen JSR? (Oder braucht man ihn hier auch nicht?) • Ja, gibt es. JSR 356 • Seit Java EE 7 verfügbar • Server-Support: • Glassfish 4 • Wildfly 8 • Jetty 9.1 • ...
  • 25. WebSockets - Serverseite • WebSocket Unterstützung schon vor JSR • große Unterschiede in der Umsetzung • sehr rudimentär: Glassfish • sehr weit fortgeschritten Jetty • Umsetzung des JSR => Jetty-Version + • Ein-/Ausgabe Konverter • Standardisierte Schnittstelle zum Versand von Text, Binärdaten, usw.
  • 26. WebSockets - Serverseite • Wie funktioniert das denn nun? • Zwei Ansätze: • Interface-basiert • Annotation-basiert
  • 27. WebSockets - Serverseite • (nahezu) beliebige POJOs als Endpoint • @ServerEndpoint("/pathForEndpoint") • @OnOpen an Methoden für Verbindungsaufbau • mit folgender Signatur: public void method(Session session, EndpointConfig cfg, @PathParam(...) String param)
  • 28. WebSockets - Serverseite • @OnClose an Methoden für Verbindungsabbau • mit folgender Signatur: public void method(Session session, CloseReason reason, @PathParam(...) String param)
  • 29. WebSockets - Serverseite • @OnMessage an Methode, die auf Client-Nachrichten reagieren soll • Signatur public void method([Variiert] message, Session session, @PathParam(...) String param)
  • 30. WebSockets - Serverseite • Für Textnachrichten: • String, Java Primitives • Reader • Für Binärnachrichten: • byte[], • ByteBuffer
  • 31. WebSockets – Ein einfaches Beispiel • Genug Theorie ;-) • Angenommen wir wollen folgenden Service schreiben: • Erreichbar unter ws://hostname:8080/chat/upper • Texte die hingeschickt werden, sollen Uppercase an alle Clients weitergeleitet werden, die verbunden sind
  • 32. WebSockets – Ein einfaches Beispiel @ServerEndpoint("/upper") public class MySocketEndpoint { @OnOpen public void open(Session newSession) { System.out.println("Open:"+newSession.getId()); } @OnClose public void close(Session closedSession) { System.out.println("Close:"+closedSession.getId()); }
  • 33. WebSockets – Ein einfaches Beispiel @OnMessage public void sendUpper(String message, Session se) { for(Session session : se.getOpenSessions()) { try { session.getBasicRemote() .sendText(message.toUpperCase()); } catch (IOException | EncodeException e) { // Error handling } } } }
  • 34. WebSockets – Abseits von Text und Bytes • Was wenn ich nicht auf Text- oder Binärdaten arbeiten will? • Decoder und Encoder um Ein- und Ausgabedaten in ein eigenes Objektmodell umzuwandeln • Bereitgestellte Interfaces: • Decoder.Text, Decoder.Binary • Encoder.Text, Encoder.Binary
  • 35. Abseits von Text und Bytes - Encoder public interface Encoder { void init(EndpointConfig var); void destroy(); [...] public interface Text<T> extends Encoder { String encode(T var) throws EncodeException; } }
  • 36. Abseits von Text und Bytes - Decoder public interface Decoder { void init(EndpointConfig var); void destroy(); [...] public interface Text<T> extends Decoder { T decode(String var) throws DecodeException; boolean willDecode(String var); } }
  • 37. WebSockets – Abseits von Text und Bytes public class Converter implements Decoder.Text<Message>, Encoder.Text<Message> { public void destroy() {...} public void init(EndpointConfiguration conf) {...} public Message decode(String messageStr) {...} public String encode(Message message) {...} public boolean willDecode(String messageStr) {...} }
  • 38. WebSockets – Abseits von Text und Bytes • Wie geschieht die Anbindung an den Endpoint? @ServerEndpoint(value="/endpoint", encoders=Converter.class, decoders=Converter.class) @OnMessage public void handleMessage(Message m, Session s) { for(Session session : s.getOpenSessions()) { session.getBasicRemote().sendObject(m); } }
  • 39. WebSockets – Ist das schon alles? • Streaming-Unterstützung • Encoder.TextStream, Decoder.TextStream • Reader bzw. Writer • Encoder.BinaryStream, Decoder.BinaryStream • InputStream bzw. OutputStream
  • 40. WebSockets – Ist das schon alles? • Pfad-Parameter • ähnlich wie man es aus REST APIs gewohnt ist @ServerEndpoint("path/{param}/endpoint") @OnMessage public void onMessage(String s, @PathParam("param") String par, Session session) {...}
  • 41. WebSockets – Ist das schon alles? • Java-Client: @ClientEndpoint public class WebsocketClientEndpoint { private MessageHandler messageHandler; public WebsocketClientEndpoint(URI endpointURI) { try { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.connectToServer(this, endpointURI); } catch (Exception e) {...} }
  • 42. Einsetzbarkeit im Java EE Bereich Okay ... Möglich ist das alles ... Aber geht das auch wirklich gut?
  • 43. Einsetzbarkeit im Java EE Bereich • Server-Sent Events: • ältere, bewährte Technologie-Basis • Technologie immer noch Grundlage vieler neuer APIs • keine letztendliche Integration mit JSF • keine Unterstützung durch Internet Explorer • auch nicht in neuen Versionen
  • 44. Einsetzbarkeit im Java EE Bereich • WebSockets: • neuer JSR • Unterstützung durch alle neueren Browser • ggf. Alternative zu SSEs für Internet Explorer • keine letztendliche Integration mit JSF • unvollständige Integration mit CDI
  • 45. Wo ist das Problem mit CDI? @ServerEndpoint("/ws_connect") public class MyEndpoint { @Inject @SessionScoped private MySessionObject mso; ... org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
  • 46. Wo ist das Problem mit CDI? • Warum nicht aktiv? Wir haben doch eine Session ... Ô_ó • Ja, aber ... • im Web-Container gebunden an HTTP-Session • WebSockets haben eigene Sessions, da nicht mehr HTTP • Komme ich irgendwie an die HTTP-Session ran? • Ja, wir haben ja den anfänglichen Handshake!
  • 47. Die ServerEndpoint Konfiguration public class SessionAccessConfig extends ServerEndpointConfig.Configurator { @Override public void modifyHandshake(ServerEndpointConfig cfg, HandshakeRequest request, HandshakeResponse response) { HttpSession session = (HttpSession) request.getHttpSession(); cfg.getUserProperties().put("httpSession", session); } }
  • 48. Die ServerEndpoint Konfiguration @ServerEndpoint(value="/upper", configurator=SessionAccesConfig.class) public class MySocketEndpoint { private String valueFromHttpSession = null; @OnOpen public void open(Session newSession, EndpointConfig cfg) { HttpSession httpSes = (HttpSession)cfg.getUserProperties .get("httpSession"); valueFromHttpSession = httpSes.getAttribute("xyz"); } ... }
  • 49. Was bringt mir das alles? • stärkeres "Feeling" einer Desktopanwendung • zunächst immenser Geschwindigkeitsgewinn • höher, je mehr Nachrichten • bis zu 400% höher • relativiert sich, beim Einsatz "in freier Natur" • Netzlatenzen (lediglich 10% bis 25%)
  • 50. Fazit • WebSockets und Server-Sent Events in modernen JavaEE Umgebungen einsetzbar • schwer mit JSF und CDI integrierbar • problemlos für kleine, losgelöste Features • als Anwendungs-Grundlage: Umdenken erforderlich
  • 51. Fazit • beides wird nicht "die Welt verändern" • Server-Sent Events: • mangelnde Unterstützung durch IE • WebSockets: • häufig wird man gerade auf CDI nicht verzichten wollen • Low-Level Protokoll
  • 52. Fazit • sind eine interessante Ergänzung • läuft neben klassischen Enterprise Anwendungen • wenn es auf Geschwindigkeit ankommt unschätzbar • sorgen für einen intuitiveren Ablauf von Kommunikation "Rufen Sie nicht den Server an, der Server ruft Sie an!"
  • 54. Vielen Dank Sebastian Reiners open knowledge GmbH www.openknowledge.de facebook.com/openknowledge twitter.com/_openknowledge

Hinweis der Redaktion

  1. Clientscript als Ausgangsbasis
  2. Request/Response -> in den Hintergrund geschoben
  3. Bayeux-Protokoll durch Dojo-Foundation Skalierung: konventionelle Servlet Engines sind nicht unbedingt darauf ausgelegt Requests so lange offen zu halten
  4. WebSocket Protokoll setzt auf TCP auf Anfangen mit Server-Sent Events
  5. kein erneuter Ab-/Aufbau => weniger Delay
  6. Natürlich nicht von sich aus
  7. Collaboration: Etherpad als Beispiel
  8. Grizzly API beim Glassfish Jetty mit "spezialisierten" Servlets
  9. Interface-Ansatz: javax.websocket.Endpoint implementieren Warum Interface weniger schön: MessageHandler in onOpen registrieren
  10. OnOpen und OnClose als Pendants zu den jeweiligen JavaScript Event-Handlern @PathParam => vielen vllt. aus REST bekannt für andere: später im Detail
  11. WAS FÜR VARIABLE PARAMETER?
  12. Etwas sinnfreie OnOpen und OnClose Methoden
  13. Worauf muss ich achten? Gibt es Pitfalls?
  14. neuer JSR: schon unterstützt durch die Server-Umgebung?
  15. ApplicationScoped funktioniert Request und SessionScoped machen Probleme
  16. Normalerweise die Servlet API aus der WebSocket API rauslassen
  17. modern: Ohne ältere Browser, bei WebSockets: neuer JavaEE Stack Alternative: proprietäre Lösungen Umdenken => anderes Konzept =>
  18. CRUD => setzt nur bedingt komplexere Kommunikationsmuster vorraus Low-Level => vieles muss man selber On-Top implementieren
  19. Vor zweitem Klick: Wenn meine Rahmenbedingungen passen: