Spring und HTML5: Frühling für den Browser

WebSockets

Falls jedoch die Daten nicht nur periodisch abgefragt, sondern bei Änderungen direkt vom Server übertragen werden sollen, benötigt man ein Push-Verfahren, das es dem Server ermöglicht Aktualisierungen zu senden. In der Vergangenheit wurden dazu unterschiedliche Lösungen eingesetzt, angefangen von HTTP Long Polling, das ein Push-Verfahren über HTTP-Anfragen simuliert, bis hin zu Streaming-Verfahren. Sämtliche Lösungen basieren jedoch auf dem recht datenintensiven HTTP-Protokoll, was die Datenmenge und die Latenz signifikant erhöht. HTML5 erlaubt durch den WebSocket-Standard, dass ein Browser mit dem Server ein „Socket“ erstellt und auf Basis dieser persistenten Verbindung beide miteinander Nachrichten austauschen können. Die Erstellung der Verbindung erfolgt dabei über ein Upgrade einer herkömmlichen HTTP-Verbindung (analog einer HTTP/SSL-Verbindung), wodurch die Verwendung in der aktuellen Webplattform ermöglicht werden soll. Während die Standardisierung des Protokolls sehr weit fortgeschritten ist, entstehen derzeit auf der Java-Serverseite (Jetty, Tomcat) eigene Implementierungen des WebSocket-Protokolls. Die Implementierungen sollen mit JSR-356 [4] möglichst bald konsolidiert werden, damit WebSocket-Anwendungen portabel auf den verschiedenen Servern betrieben werden können. Eine Alternative bis zum Erscheinen des Standards stellen auch WebSocket-Frameworks wie Atmosphere [5] dar. Neben der Portabilität auf dem Server erlauben die Frameworks auch auf der Clientseite die Anbindung von Browsern, die kein WebSocket unterstützten. In diesem Fall wird auf Long Polling oder HTTP-Streaming zurückgegriffen. Das Atmosphere-Framework integriert sich in viele Java-Webtechnologien (z .B. in GWT), und liefert unter anderem mehrere Beispiele zu dessen Integration in eine Spring-Anwendung mit. Die Controller können, wie aus Listing 4 ersichtlich ist, einfach eine Anfrage zum Upgrade einer Verbindung entgegen nehmen und anschließend periodisch einzelne Nachrichten an den Client übermitteln. Neben der periodischen Übermittlung sind auch komplexere Event-gesteuerte Übertragungen an den Client möglich.

Listing 4
@RequestMapping("/myUrl")
public void twitterAsync(AtmosphereResource atmosphereResource){  
  atmosphereResource.suspend();
  Broadcaster bc = atmosphereResource.getBroadcaster();

    bc.scheduleFixedBroadcast(new Callable() {

        public String call() throws Exception {
      return "Nachricht für den Client";
}
        }, 10, TimeUnit.SECONDS);
  }

Während es auf der Java-Plattform mit dem Concurrency-API eine ausgereifte und bewährte Bibliothek für die asynchrone und parallele Verarbeitung gibt, fehlen diese bisher auf der Browserplattform. Die Script-Ausführung erfolgt letztlich auf Grund von Beschränkungen der JavaScript-Plattform synchron. Einzelne Techniken, wie XMLHttpRequest oder die Verwendung des setTimeout()Callback, blockieren zwar nicht die Ausführung des Codes, sind jedoch trotzdem nicht parallel. HTML5 liefert mit der WebWorker-Spezifikation die Möglichkeit der wirklich parallelen Ausführung von Skripten im Browser. Dadurch können parallele Skriptausführungen, vor allem von Skripten, die WebSocket-Verbindungen öffnen, ermöglicht werden.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.