26
|1 WebSockets i OpenLayers spojeni Spring-om

JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Embed Size (px)

DESCRIPTION

Need for seamless communication between web browser and back-end server has resulted in technology called WebSocket. In this presentation we will see what is WebSocket and how can we leverage Spring framework and STOMP (Streaming Text Oriented Messaging Protocol) to display GPS coordinates on OpenLayers map in real time.

Citation preview

Page 1: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

| 1WebSockets i OpenLayers spojeni Spring-om

Page 2: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kapsch – O kompaniji

| 2WebSockets i OpenLayers spojeni Spring-om

Page 3: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kapsch CarrierCom

WebSocket

| |Presentation heading Presentation subheading 330.04.2014

Page 4: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Što je to WebSocket

�Protokol koji pruža full-duplex komunikacijske

kanale preko jedne TCP konekcije

�Dizajniran za implementaciju u web

preglednicima i web serverima

| 4WebSockets i OpenLayers spojeni Spring-om

preglednicima i web serverima

�2011 standardiziran od strane IETF kao

RFC 6455

�API u Web IDL-u standardiziran od strane W3C

Page 5: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Zašto je nastao WebSocket

�Za komunikaciju između servera i klijenta su se

koristili različiti „hackovi” na HTTP protokolu

�WebSocket protokol omogućava bolju

interaktivnost

| 5WebSockets i OpenLayers spojeni Spring-om

interaktivnost

�Porast web baziranih sadržaja (igre, chat,

video…) koji traže bidirekcijsku komunikaciju

Page 6: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kako radi WebSocket protokol

1. Uspostavljanje WebSocket

konekcije

• Klijent zahtjeva unapređenje

protokola na koje server, ukoliko

to može, odgovara

2. Razmjena podataka

ServerClient

HTTP GET Upgrade Request

HTTP 101 Switching Protocols Response

send(data)

1

| 6WebSockets i OpenLayers spojeni Spring-om

2. Razmjena podataka

• Do zatvaranja konekcije

asinkrona razmjena podataka

3. Zatvaranje WebSocket

konekcije

• Klijent inicira zatvaranje

konekcije

send(data)

onmessage(data)

Close

.

.

.

3

2OnMessage(data)

Send(data)

Page 7: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Što treba imati na umu

�Proxy, firewall ili neki drugi mrežni element može blokirati

WebSocket komunikaciju između servera i klijenta

�Preglednik na klijentskoj strani ne podržava WebSocket

komunikaciju

| 7WebSockets i OpenLayers spojeni Spring-om

komunikaciju

• Internet Explorer & IE Moblie – 10.0

• Firefox – 6.0

• Chrome – 14.0

• Safari & iOS Safari – 6.0

• Android Browser – 4.4

Page 8: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Java & WebSockets

�JSR 356: JavaTM API for WebSocket (finaliziran

22 Svibanj, 2013)

| 8WebSockets i OpenLayers spojeni Spring-om

�Čak i prije JSR 356 većina web servera (Tomcat,

Glassfish, Jetty, JBoss,…) imaju implementaciju

WebSocket protokola, no nema standarda

Page 9: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Aplikacija

�Klijent u pregledniku vidi

stranicu s kartom

�Na karti se prikazuju

lokacije vozila

Klijent

| 9WebSockets i OpenLayers spojeni Spring-om

lokacije vozila

�Vozila periodički šalju svoju

lokaciju na server

�Server podatke o lokaciji

prosljeđuje pregledniku, tj.

karti

Server

Vozila

Page 10: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kapsch CarrierCom

Spring, WebSocket, STOMP

Serverski dio aplikacije

| |Presentation heading Presentation subheading 1030.04.2014

Page 11: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Spring – WebSocket

�Podrška za WebSocket u Spring 4

�Spring 4 sadrži novi spring-messaging modul koji

preuzima određene apstrakcije iz Spring

Integration projekta

| 11WebSockets i OpenLayers spojeni Spring-om

Integration projekta

�Podržava STOPM protokol

�Omogućuje „fallback” u slučaju da WebSocket

protokol nije podržan

Page 12: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

STOMP

�WebSocket se nalazi malo iznad TCP, te kao

takav predstavlja tzv. spojni protokol

�Za komunikaciju potrebno je implementirati pod

protokol, na primjer STOMP

| 12WebSockets i OpenLayers spojeni Spring-om

protokol, na primjer STOMP

�Streaming Text Oriented Messaging Protocol

�Neovisan o jeziku aplikacije

(language-agnostic)

Page 13: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Poruka o lokaciji

Poruka koju izmjenjuju Vozila, Server i Klijent.

public class Location {

private int vehicleId;

| 13WebSockets i OpenLayers spojeni Spring-om

private int vehicleId;

private float lon;

private float lat;

}

Page 14: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kontroler

Kontroler koji obrađuje poruke poslane iz vozila.

@Controller

public class LocationController {

| 14WebSockets i OpenLayers spojeni Spring-om

@MessageMapping("/inlocations")

@SendTo("/topic/vlocations")

public Location handleInLocation(

Location inLocation) throws Exception {

return inLocation;

}

}

Page 15: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Konfiguracija WebSocketa

Konfiguracija WebSocket-a.

@Configuration

@EnableWebSocketMessageBroker

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override

| 15WebSockets i OpenLayers spojeni Spring-om

public void configureMessageBroker(MessageBrokerRegistry config)

{

config.enableSimpleBroker("/topic");

config.setApplicationDestinationPrefixes("/app");

}

@Override

public void registerStompEndpoints(StompEndpointRegistry registry)

{

registry.addEndpoint("/inlocations").withSockJS();

}

}

Page 16: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kapsch CarrierCom

OpenLayers, sockjs.js, stomp.js

Klijentski dio aplikacije

| |Presentation heading Presentation subheading 1630.04.2014

Page 17: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

OpenLayers (1)

�Biblioteka za prikaz karti

�Otvoreni kod

�Podržava prikaz karti iz više izvora

| 17WebSockets i OpenLayers spojeni Spring-om

�Podržava prikaz karti iz više izvora

�OpenStreetMap

�Google

�Bing

�Yahoo

Page 18: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

OpenLayers (2)

Bazni slojevi (base layer) Markeri (markers)

Karta

| 18WebSockets i OpenLayers spojeni Spring-om

Geometrija (geometry)Kontrola (control)

Page 19: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

OpenLayers (3)

OpenStreetMap – OSM

�Bazni sloj koji se koristi kao karta

�Web Map Service (WMS)

| 19WebSockets i OpenLayers spojeni Spring-om

�Koristi EPSG:900913 projekciju

Projekcije

�EPSG:4326 (geodetske koordinate, širina i dužina)

�EPSG:900913 (sferni Mercator, metari)

Page 20: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

OpenLayers (4)

DOM objekt u kojem će se iscrtati karta

<div id="map"></div>

Inicijalizacija karte, OSM sloja i sloja s markerima

var map = new OpenLayers.Map('map');

var layer = new OpenLayers.Layer.OSM('Simple OSM Map');

map.addLayer(layer);

| 20WebSockets i OpenLayers spojeni Spring-om

map.addLayer(layer);

var markers = new OpenLayers.Layer.Markers('Markers');

map.addLayer(markers);

Dodavanje markera na kartu

var size = new OpenLayers.Size(24,24);

var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);

var icon = new OpenLayers.Icon('/icons/vehicle1.png',size,offset);

var location = new OpenLayers.LonLat(13.595356,45.226899).transform(

new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject());

var marker = new OpenLayers.Marker(location,icon);

markers.addMarker(marker);

Page 21: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

sockjs.js & stomp.js (1)

Otvaranje konekcijefunction connect() {

var socket = new SockJS('/inlocations');

stompClient = Stomp.over(socket);

stompClient.connect({}, function(frame) {

setConnected(true);

console.log('Connected: ' + frame);

| 21WebSockets i OpenLayers spojeni Spring-om

console.log('Connected: ' + frame);

stompClient.subscribe('/topic/vlocations', function(location){

showLocation(JSON.parse(location.body).content);

});

});

}

Zatvaranje konekcijefunction disconnect() {

stompClient.disconnect();

setConnected(false);

console.log('Disconnected');

}

Page 22: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

sockjs.js & stomp.js (2)

Slanje lokacijefunction sendLocation(location) {

stompClient.send('/app/inlocations', {}, JSON.stringify(location));

}

Prikaz lokacijefunction showLocation(location) {

if(!marker) {

| 22WebSockets i OpenLayers spojeni Spring-om

if(!marker) {

addMarker(location);

}

else {

var lPx = map.getPixelFromLonLat(

new OpenLayers.LonLat(location.longitude, location.latitude)

.transform(

new OpenLayers.Projection('EPSG:4326'),

map.getProjectionObject()

)

);

marker.moveTo(lPx);

}

}

Page 23: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Kapsch CarrierCom

Demonstracija

| |Presentation heading Presentation subheading 2330.04.2014

Page 24: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Zaključak

�Dobro analizirati zahtjeve aplikacije, možda

WebSocket nije najbolje rješenje

�Dobro analizirati infrastrukturu, možda

WebSocket komunikaciju nije moguće ostvariti

| 24WebSockets i OpenLayers spojeni Spring-om

WebSocket komunikaciju nije moguće ostvariti

�Dobro analizirati klijente, možda nemaju

preglednike (ili infrastrukturu) koji podržavaju

WebSocket-e

�„Hope for the best, prepare for the worst”

Page 25: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Reference

� WebSocket

http://www.websocket.org

� Spring

http://spring.io/guides/gs/messaging-stomp-websocket

| 25WebSockets i OpenLayers spojeni Spring-om

http://spring.io/guides/gs/messaging-stomp-websocket

� STOMP

http://en.wikipedia.org/wiki/Streaming_Text_Oriented_Messaging_Protocol

� OpenLayers

http://openlayers.org

� OpenStreetMap

http://www.openstreetmap.org

Page 26: JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin

Hvala!

| 26WebSockets i OpenLayers spojeni Spring-om

Hvala!