Reaktívne webové zásuvky s pružinou 5

1. Prehľad

V tomto článku si ukážeme rýchly príklad pomocou nového rozhrania Spring 5 WebSockets API spolu s reaktívnymi funkciami, ktoré poskytuje Spring WebFlux.

WebSocket je známy protokol, ktorý umožňuje plne duplexnú komunikáciu medzi klientom a serverom. Spravidla sa používa vo webových aplikáciách, kde si klient a server musia vymieňať udalosti s vysokou frekvenciou a nízkou latenciou.

Spring Framework 5 modernizoval podporu WebSockets v rámci a pridal reaktívne schopnosti k tomuto komunikačnému kanálu.

Viac o Spring WebFlux nájdete tu.

2. Maven závislosti

Závislosti spring-boot-starters použijeme na integráciu spring-boot a spring-boot-starter-webflux, ktoré sú momentálne k dispozícii v úložisku Spring Milestone Repository.

V tomto príklade používame najnovšiu dostupnú verziu 2.0.0.M7, ale vždy by sme mali dostať najnovšiu verziu dostupnú v úložisku Maven:

 org.springframework.boot spring-boot-starter-integrácia org.springframework.boot spring-boot-starter-webflux 

3. Konfigurácia WebSocket na jar

Naša konfigurácia je dosť jednoznačná: vstrekneme WebSocketHandler na spracovanie relácie soketu v našej aplikácii Spring WebSocket.

@Autowired private WebSocketHandler webSocketHandler; 

Ďalej vytvorme a HandlerMapping metóda komentovaná fazuľou, ktorá bude zodpovedná za mapovanie medzi požiadavkami a objektmi obslužnej rutiny:

@Bean public HandlerMapping webSocketHandlerMapping () {Mapa mapy = nový HashMap (); map.put ("/ event-emitter", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = nový SimpleUrlHandlerMapping (); handlerMapping.setOrder (1); handlerMapping.setUrlMap (mapa); return handlerMapping; }

URL, ku ktorému sa môžeme pripojiť, bude: ws: // localhost: / event-emitter.

4. Spracovanie správ WebSocket na jar

Náš ReactiveWebSocketHandler trieda bude zodpovedná za správu relácie WebSocket na strane servera.

Vykonáva WebSocketHandler rozhranie, aby sme mohli prepísať zvládnuť metóda, ktorá sa použije na odoslanie správy klientovi WebSocket:

@ Verejná trieda komponentu ReactiveWebSocketHandler implementuje WebSocketHandler {// súkromné ​​polia ... @Override public Mono handle (WebSocketSession webSocketSession) {return webSocketSession.send (intervalFlux .map (webSocketSession :: textMessage)) .and (webSocketSession.receive (). (WebSocketMessage :: getPayloadAsText) .log ()); }}

5. Vytvorenie jednoduchého reaktívneho klienta WebSocket

Poďme teraz vytvoriť klienta Spring Reactive WebSocket, ktorý sa bude môcť pripojiť a vymieňať si informácie s našim serverom WebSocket.

5.1. Maven závislosť

Po prvé, závislosti Maven.

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

Tu používame ten istý spring-boot-starter-webflux, ktorý sme použili predtým na nastavenie našej reaktívnej serverovej aplikácie WebSocket.

5.2. Klient WebSocket

Teraz vytvorme ReactiveClientWebSocket trieda, zodpovedná za začatie komunikácie so serverom:

public class ReactiveJavaClientWebSocket {public static void main (String [] args) hodí InterruptedException {WebSocketClient client = new 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)); }}

V kóde vyššie vidíme, že používame ReactorNettyWebSocketClient, Ktoré je WebSocketClient implementácia pre použitie s Reactor Netty.

Ďalej sa klient pripája k serveru WebSocket prostredníctvom adresy URL ws: // localhost: 8080 / event-emitter, nadviazanie relácie hneď po pripojení k serveru.

Vidíme tiež, že posielame správu na server („udalosť-jar-reaktívny-klient-websocket“) Spolu so žiadosťou o pripojenie.

Ďalej metóda poslať je vyvolaná, očakávajúc ako parameter premennú typu Vydavateľ, ktoré v našom prípade naše Vydavateľ je Mono a T je jednoduchý reťazec “event-me-from-reactive-java-client-websocket“.

Okrem toho thenMany (...) metóda očakávajúca a Flux typu String je vyvolaná. The príjem () metóda získa tok prichádzajúcich správ, ktoré sa neskôr prevedú na reťazce.

Nakoniec blok () metóda prinúti klienta odpojiť sa od daného času po danom čase (v našom príklade 10 sekúnd).

5.3. Spustenie klienta

Ak ho chcete spustiť, uistite sa, že je server Reactive WebSocket funkčný. Potom spustite ReactiveJavaClientWebSocket triedy a vidíme na sysout zaznamenajte emitované udalosti:

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

V protokole z nášho reaktívneho servera WebSocket môžeme vidieť aj správu odoslanú klientom počas pokusu o pripojenie:

[reaktor-http-nio-2] reaktor.Flux.Map.1: onNext (udalosť-ja-z-reaktívneho-java-klienta)

Tiež môžeme vidieť správu o ukončenom pripojení potom, čo klient dokončí svoje požiadavky (v našom prípade po 10 sekundách):

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

6. Vytvorenie klienta WebSocket prehľadávača

Vytvorme jednoduchý klient HTML / Javascript WebSocket, ktorý bude využívať našu reaktívnu aplikáciu servera WebSocket.

 var clientWebSocket = nový 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 = funkcia (chyba) {console.log ("clientWebSocket.onclose", clientWebSocket, chyba); udalosti („Ukončovacie spojenie“); } clientWebSocket.onerror = funkcia (chyba) {console.log ("clientWebSocket.onerror", clientWebSocket, chyba); udalosti („Vyskytla sa chyba“); } clientWebSocket.onmessage = funkcia (chyba) {console.log ("clientWebSocket.onmessage", clientWebSocket, chyba); udalosti (error.data); } udalosti funkcií (responseEvent) {document.querySelector (". events"). innerHTML + = responseEvent + "

"; }

Ak je server WebSocket spustený a po otvorení tohto súboru HTML v prehliadači (napr. Chrome, Internet Explorer, Mozilla Firefox atď.), Mali by sme vidieť udalosti, ktoré sa tlačia na obrazovku, s oneskorením jednej sekundy na udalosť, ako je definované v náš server WebSocket.

{"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. Záver

Tu sme predstavili príklad toho, ako vytvoriť komunikáciu WebSocket medzi serverom a klientom pomocou Spring 5 Framework a implementovať nové reaktívne funkcie poskytované Spring Webflux.

Celý príklad nájdete ako vždy v našom úložisku GitHub.


$config[zx-auto] not found$config[zx-overlay] not found