Reaktivne web-utičnice s oprugom 5

1. Pregled

U ovom ćemo članku stvoriti brzi primjer pomoću novog API-ja Spring 5 WebSockets zajedno s reaktivnim značajkama koje pruža Spring WebFlux.

WebSocket je dobro poznati protokol koji omogućuje full-duplex komunikaciju između klijenta i poslužitelja, koji se obično koristi u web aplikacijama gdje klijent i poslužitelj trebaju razmjenjivati ​​događaje na visokoj frekvenciji i s malim kašnjenjem.

Spring Framework 5 modernizirao je podršku za WebSockets u okviru, dodajući reaktivne mogućnosti ovom komunikacijskom kanalu.

Više o Spring WebFluxu možemo pronaći ovdje.

2. Ovisnosti Mavena

Koristit ćemo ovisnosti spring-boot-starters za Spring-boot-integraciju i spring-boot-starter-webflux, trenutno dostupne u Spremištu Spring Milestone.

U ovom primjeru koristimo najnoviju dostupnu verziju 2.0.0.M7, ali uvijek treba nabaviti najnoviju verziju dostupnu u spremištu Maven:

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

3. WebSocket konfiguracija u proljeće

Naša je konfiguracija prilično jednostavna: ubrizgat ćemo WebSocketHandler za obradu sesije utičnice u našoj Spring WebSocket aplikaciji.

@Autowired privatni WebSocketHandler webSocketHandler; 

Nadalje, stvorimo a HandlerMapping metoda označena grahom koja će biti odgovorna za mapiranje između zahtjeva i objekata rukovatelja:

@Bean public HandlerMapping webSocketHandlerMapping () {Map map = new HashMap (); map.put ("/ emiter događaja", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = novo SimpleUrlHandlerMapping (); handlerMapping.setOrder (1); handlerMapping.setUrlMap (karta); return handlerMapping; }

URL na koji se možemo povezati bit će: ws: // localhost: / event-emitter.

4. Upravljanje porukama WebSocket u proljeće

Naše ReactiveWebSocketHandler klase bit će odgovoran za upravljanje sesijom WebSocket na strani poslužitelja.

Provodi WebSocketHandler sučelje kako bismo mogli nadjačati drška metoda koja će se koristiti za slanje poruke klijentu WebSocket:

@Component javna klasa ReactiveWebSocketHandler implementira WebSocketHandler {// privatna polja ... @Preuzmi javnu mono ručku (WebSocketSession webSocketSession) {return webSocketSession.send (intervalFlux .map (webSocketSession :: textMessage). (WebSocketMessage :: getPayloadAsText) .log ()); }}

5. Stvaranje jednostavnog reaktivnog klijenta WebSocket

Stvorimo sada Spring Reactive WebSocket klijenta koji će se moći povezati i razmjenjivati ​​informacije s našim WebSocket poslužiteljem.

5.1. Ovisnost Mavena

Prvo, Mavenove ovisnosti.

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

Ovdje koristimo isti Spring-boot-starter-webflux koji je prethodno korišten za postavljanje reaktivne aplikacije poslužitelja WebSocket.

5.2. Klijent WebSocket

Sada, kreirajmo ReactiveClientWebSocket klase, odgovorne za započinjanje komunikacije s poslužiteljem:

javna klasa ReactiveJavaClientWebSocket {javna statička void glavna (String [] args) baca 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)); }}

U gornjem kodu možemo vidjeti da koristimo ReactorNettyWebSocketClient, koje je WebSocketClient implementacija za upotrebu s Reactor Netty.

Osim toga, klijent se povezuje s poslužiteljem WebSocket putem URL-a ws: // localhost: 8080 / emiter događaja, uspostavljanje sesije čim je spojena na poslužitelj.

Također možemo vidjeti da šaljemo poruku poslužitelju („event-spring-reactive-client-websocket“) Zajedno sa zahtjevom za povezivanje.

Nadalje, metoda poslati poziva se, očekujući kao parametar varijablu tipa Izdavač, koja je u našem slučaju naša Izdavač je Mono i T je jednostavan niz “događaj-ja-iz-reaktivne-jave-klijenta-web-utičnica“.

Štoviše, zatimMnogi (...) metoda koja očekuje a Fluks tipa Niz se poziva. The primiti () metoda dobiva tok dolaznih poruka, koje se kasnije pretvaraju u nizove.

Napokon, blok() metoda prisiljava klijenta da se prekine vezu s poslužiteljem nakon određenog vremena (10 sekundi u našem primjeru).

5.3. Pokretanje klijenta

Da biste ga pokrenuli, provjerite radi li reaktivni poslužitelj WebSocket Server. Zatim pokrenite ReactiveJavaClientWebSocket razreda, a to možemo vidjeti na sysout zabilježite emitirane događaje:

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

Također možemo vidjeti u zapisniku našeg Reactive WebSocket poslužitelja poruku koju je klijent poslao tijekom pokušaja povezivanja:

[reactor-http-nio-2] reactor.Flux.Map.1: onNext (event-me-from-reactive-java-client)

Također, možemo vidjeti poruku prekinutog povezivanja nakon što je klijent dovršio svoje zahtjeve (u našem slučaju nakon 10 sekundi):

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

6. Izrada klijenta WebSocket preglednika

Stvorimo jednostavan HTML / Javascript klijent WebSocket koji će trošiti našu reaktivnu aplikaciju poslužitelja WebSocket.

 var clientWebSocket = novi 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 = funkcija (pogreška) {console.log ("clientWebSocket.onclose", clientWebSocket, pogreška); događaji ("Zatvaranje veze"); } clientWebSocket.onerror = funkcija (pogreška) {console.log ("clientWebSocket.onerror", clientWebSocket, pogreška); događaji ("Dogodila se pogreška"); } clientWebSocket.onmessage = funkcija (pogreška) {console.log ("clientWebSocket.onmessage", clientWebSocket, pogreška); događaji (error.data); } događaji funkcije (responseEvent) {document.querySelector (". događaji"). innerHTML + = responseEvent + "

"; }

Dok je pokrenut poslužitelj WebSocket, koji otvara ovu HTML datoteku u pregledniku (npr. Chrome, Internet Explorer, Mozilla Firefox itd.), Trebali bismo vidjeti događaje koji se ispisuju na ekranu, s odgodom od 1 sekunde po događaju, kako je definirano u naš WebSocket poslužitelj.

{"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. Zaključak

Ovdje smo predstavili primjer kako stvoriti WebSocket komunikaciju između poslužitelja i klijenta pomoću Spring 5 Framework, implementirajući nove reaktivne značajke koje pruža Spring Webflux.

Kao i uvijek, cjelovit primjer možete pronaći u našem GitHub spremištu.


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