Reaktív WebSocketek az 5. rugóval

1. Áttekintés

Ebben a cikkben egy gyors példát fogunk készíteni az új Spring 5 WebSockets API és a Spring WebFlux által nyújtott reaktív funkciók felhasználásával.

A WebSocket egy jól ismert protokoll, amely lehetővé teszi a teljes duplex kommunikációt az ügyfél és a szerver között, általában olyan webes alkalmazásokban használják, ahol az ügyfélnek és a szervernek nagy gyakorisággal és alacsony késéssel kell kicserélnie az eseményeket.

A Spring Framework 5 korszerűsítette a WebSockets támogatást a keretben, reaktív képességekkel egészítve ki ezt a kommunikációs csatornát.

A Spring WebFlux-ról itt talál további információt.

2. Maven-függőségek

A tavaszi-indító-indítók függőségeket fogjuk használni a rugó-indítás-integráció és a rugó-indítás-indító-webflux használatához, amelyek jelenleg a Spring Milestone Repository-ban érhetők el.

Ebben a példában a legfrissebb elérhető verziót, a 2.0.0.M7-et használjuk, de mindig meg kell szereznünk a Maven tárházban elérhető legfrissebb verziót:

 org.springframework.boot spring-boot-starter-integráció org.springframework.boot spring-boot-starter-webflux 

3. A WebSocket beállítása tavasszal

Konfigurációnk elég egyszerű: beadjuk a WebSocketHandler hogy kezelje a socket munkamenetet a Tavaszi WebSocket alkalmazásban.

@Autowired private WebSocketHandler webSocketHandler; 

Hozzunk létre továbbá egy HandlerMapping bab-annotált módszer, amely felelős lesz a lekérdezések és a kezelő objektumok leképezéséért:

@Bean public HandlerMapping webSocketHandlerMapping () {Map map = new HashMap (); map.put ("/ event-emitter", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = új SimpleUrlHandlerMapping (); handlerMapping.setOrder (1); handlerMapping.setUrlMap (térkép); return handlerMapping; }

Az az URL, amelyhez kapcsolódhatunk, a következő lesz: ws: // localhost: / event-emitter.

4. WebSocket üzenetkezelés tavasszal

A mi ReactiveWebSocketHandler osztály felelős lesz a WebSocket munkamenet szerver oldali kezeléséért.

Megvalósítja a WebSocketHandler felületet, így felülírhatjuk a fogantyú módszer, amellyel az üzenetet elküldik a WebSocket kliensnek:

A @Component public class ReactiveWebSocketHandler a WebSocketHandler {// privát mezőket valósítja meg ... (WebSocketMessage :: getPayloadAsText) .log ()); }}

5. Egyszerű reaktív WebSocket kliens létrehozása

Hozzunk létre most egy Spring Reactive WebSocket klienst, amely képes csatlakozni és információt cserélni a WebSocket szerverünkkel.

5.1. Maven-függőség

Először a Maven-függőségek.

 org.springframework.boot spring-boot-starter-webflux 

Itt ugyanazt a spring-boot-starter-webflux-ot használjuk, mint korábban a reaktív WebSocket kiszolgáló alkalmazásunk beállításához.

5.2. WebSocket kliens

Most hozzuk létre a ReactiveClientWebSocket osztály, felelős a szerverrel való kommunikáció megkezdéséért:

public class ReactiveJavaClientWebSocket {public static void main (String [] args) dobja az InterruptedException {WebSocketClient kliens = új ReactorNettyWebSocketClient (); client.execute (URI.create ("ws: // localhost: 8080 / event-emitter"), session -> session.send (Mono.just (session.textMessage ("event-spring-reactive-client-websocket") )) .thenMany (session.receive () .map (WebSocketMessage :: getPayloadAsText) .log ()) .then ()) .block (Duration.ofSeconds (10L)); }}

A fenti kódban láthatjuk, hogy a ReactorNettyWebSocketClient, ami a WebSocketClient megvalósítás a Netty reaktorral való használatra.

Ezenkívül az ügyfél az URL-en keresztül csatlakozik a WebSocket szerverhez ws: // localhost: 8080 / event-emitter, munkamenet létrehozása, amint csatlakozik a szerverhez.

Azt is láthatjuk, hogy üzenetet küldünk a szervernek („event-tavasz-reaktív-kliens-websocket“) A csatlakozási kérelemmel együtt.

Továbbá a módszer Küld hívásra kerül, paraméterként egy típusú változót vár Kiadó, amely esetünkben a mi Kiadó van Monó és T egy egyszerű karakterláncevent-me-from-reaktív-java-client-websocket“.

Sőt, a akkorSok (…) módszer elvárás a Fényáram típusú Húr hivatkozik. A kap() A metódus bejövő üzenetek fluxusát kapja, amelyeket később stringekké alakítanak át.

Végül a Blokk() A módszer arra kényszeríti az ügyfelet, hogy a megadott idő után (példánkban 10 másodperc) leváljon a szerverről.

5.3. Az ügyfél elindítása

A futtatásához ellenőrizze, hogy a Reactive WebSocket Server fut-e. Ezután indítsa el a ReactiveJavaClientWebSocket osztályban, és láthatjuk a sysout naplózza a kibocsátott eseményeket:

[reaktor-http-nio-4] INFO reaktor.Flux.Map.1 - onNext ({"eventId": "6042b94f-fd02-47a1-911d-dacf97f12ba6", "eventDt": "2018-01-11T23: 29: 26.900 "})

A Reactive WebSocket kiszolgálónk naplójában láthatjuk azt az üzenetet is, amelyet az ügyfél küldött a csatlakozási kísérlet során:

[reaktor-http-nio-2] reaktor.Flux.Map.1: onNext (event-me-from-reaktív-java-kliens)

Láthatjuk a megszakadt kapcsolat üzenetét is, miután az ügyfél befejezte a kéréseit (esetünkben a 10 másodperc után):

[reaktor-http-nio-2] reaktor.Flux.Map.1: onComplete ()

6. Böngésző WebSocket kliens létrehozása

Hozzunk létre egy egyszerű HTML / Javascript kliens WebSocket-et a reaktív WebSocket szerver alkalmazásunk felhasználásához.

 var clientWebSocket = new WebSocket ("ws: // localhost: 8080 / event-emitter"); clientWebSocket.onopen = function () {console.log ("clientWebSocket.onopen", clientWebSocket); console.log ("clientWebSocket.readyState", "websocketstatus"); clientWebSocket.send ("event-me-from-browser"); } clientWebSocket.onclose = function (error) {console.log ("clientWebSocket.onclose", clientWebSocket, hiba); események ("Bezárás"); } clientWebSocket.onerror = function (error) {console.log ("clientWebSocket.onerror", clientWebSocket, hiba); események ("Hiba történt"); } clientWebSocket.onmessage = function (error) {console.log ("clientWebSocket.onmessage", clientWebSocket, hiba); események (hiba.adatok); } function events (responseEvent) {document.querySelector (". events"). internalHTML + = responseEvent + "

"; }

Ha fut a WebSocket szerver, és megnyitja ezt a HTML fájlt egy böngészőben (pl .: Chrome, Internet Explorer, Mozilla Firefox stb.), Látnunk kell a képernyőn kinyomtatott eseményeket, eseményenként 1 másodperces késleltetéssel, a a WebSocket szerver.

{"eventId": "c25975de-6775-4b0b-b974-b396847878e6", "eventDt": "2018-01-11T23: 56: 09.780"} {"eventId": "ac74170b-1f71-49d3-8737-b3f9a8a352f9", "eventDt": "2018-01-11T23: 56: 09.781"} {"eventId": "40d8f305-f252-4c14-86d7-ed134d3e10c6", "eventDt": "2018-01-11T23: 56: 09.782"}

7. Következtetés

Itt bemutattunk egy példát arra, hogyan lehet WebSocket kommunikációt létrehozni a szerver és az ügyfél között az Spring 5 Framework használatával, a Spring Webflux által biztosított új reaktív szolgáltatások megvalósításával.

Mint mindig, a teljes példa megtalálható a GitHub adattárunkban.