Reaktive WebSockets med vår 5

1. Oversikt

I denne artikkelen skal vi lage et raskt eksempel ved å bruke den nye Spring 5 WebSockets API sammen med reaktive funksjoner levert av Spring WebFlux.

WebSocket er en kjent protokoll som muliggjør full-dupleks kommunikasjon mellom klient og server, vanligvis brukt i webapplikasjoner der klienten og serveren trenger å utveksle hendelser med høy frekvens og med lav ventetid.

Spring Framework 5 har modernisert WebSockets-støtte i rammeverket, og tilfører reaktive evner til denne kommunikasjonskanalen.

Vi finner mer på Spring WebFlux her.

2. Maven-avhengigheter

Vi skal bruke avhengighetene for vår-start-start-start for vår-boot-integrasjon og spring-boot-starter-webflux, som for øyeblikket er tilgjengelig på Spring Milestone Repository.

I dette eksemplet bruker vi den siste tilgjengelige versjonen, 2.0.0.M7, men man bør alltid få den nyeste versjonen tilgjengelig i Maven-arkivet:

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

3. WebSocket-konfigurasjon om våren

Konfigurasjonen vår er ganske grei: Vi injiserer WebSocketHandler for å håndtere stikkontakten i vår Spring WebSocket-applikasjon

@Autowired privat WebSocketHandler webSocketHandler; 

Videre, la oss lage en HandlerMapping bønne-merket metode som vil være ansvarlig for kartleggingen mellom forespørsler og behandlerobjekter:

@Bean public HandlerMapping webSocketHandlerMapping () {Map map = new HashMap (); map.put ("/ event-emitter", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = ny SimpleUrlHandlerMapping (); handlerMapping.setOrder (1); handlerMapping.setUrlMap (kart); returhåndteringKartlegging; }

URL-en vi kan koble til vil være: ws: // localhost: / event-emitter.

4. Håndtering av WebSocket-meldinger om våren

Våre ReactiveWebSocketHandler klasse vil være ansvarlig for å administrere WebSocket-økten på serversiden.

Den implementerer WebSocketHandler grensesnitt slik at vi kan overstyre håndtak metode, som vil bli brukt til å sende meldingen til WebSocket-klienten:

@Component public class ReactiveWebSocketHandler implementerer WebSocketHandler {// private felt ... @ Override offentlig monohåndtak (WebSocketSession webSocketSession) {return webSocketSession.send (intervalFlux .map (webSocketSession :: textMessage)). Og (webSocketSession.receive () .map (WebSocketMessage :: getPayloadAsText) .log ()); }}

5. Opprette en enkel reaktiv WebSocket-klient

La oss nå opprette en Spring Reactive WebSocket-klient som kan koble til og utveksle informasjon med vår WebSocket-server.

5.1. Maven avhengighet

Først Maven-avhengighetene.

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

Her bruker vi den samme spring-boot-starter-webfluxen som tidligere ble brukt for å sette opp vårt reaktive WebSocket-serverprogram.

5.2. WebSocket-klient

Nå, la oss lage ReactiveClientWebSocket klasse, ansvarlig for å starte kommunikasjonen med serveren:

public class ReactiveJavaClientWebSocket {public static void main (String [] args) kaster 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)); }}

I koden ovenfor kan vi se at vi bruker ReactorNettyWebSocketClient, hvilken er den WebSocketClient implementering for bruk med Reactor Netty.

I tillegg kobles klienten til WebSocket-serveren via URL-en ws: // localhost: 8080 / event-emitter, etablere en økt så snart den er koblet til serveren.

Vi kan også se at vi sender en melding til serveren (“event-spring-reactive-client-websocket“) Sammen med tilkoblingsforespørselen.

Videre metoden sende blir påkalt, og forventer som parameter en variabel av typen Forlegger, som i vårt tilfelle vår Forlegger er Mono og T er en enkel streng “event-me-from-reactive-java-client-websocket“.

Videre, den daMange (...) metode som forventer en Flux av typen String påberopes. De motta() metoden får strømmen av innkommende meldinger, som senere blir konvertert til strenger.

Til slutt, blokkere() metoden tvinger klienten til å koble seg fra serveren etter gitt tid (10 sekunder i vårt eksempel).

5.3. Starte klienten

For å kjøre den, må du sørge for at Reactive WebSocket Server er i gang. Start deretter ReactiveJavaClientWebSocket klasse, og vi kan se på sysout logg hendelsene som sendes ut:

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

Vi kan også se meldingen fra klienten fra tilkoblingsforsøket i loggen fra Reactive WebSocket-serveren:

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

Vi kan også se meldingen om avsluttet forbindelse etter at klienten avsluttet forespørslene (i vårt tilfelle etter de 10 sekundene):

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

6. Opprette en nettleser WebSocket Client

La oss lage en enkel HTML / Javascript-klient WebSocket for å konsumere vårt reaktive WebSocket-serverprogram.

 var clientWebSocket = ny WebSocket ("ws: // localhost: 8080 / event-emitter"); clientWebSocket.onopen = funksjon () {console.log ("clientWebSocket.onopen", clientWebSocket); console.log ("clientWebSocket.readyState", "websocketstatus"); clientWebSocket.send ("hendelse-meg-fra-nettleser"); } clientWebSocket.onclose = funksjon (feil) {console.log ("clientWebSocket.onclose", clientWebSocket, feil); hendelser ("Avsluttende forbindelse"); } clientWebSocket.onerror = funksjon (feil) {console.log ("clientWebSocket.onerror", clientWebSocket, feil); hendelser ("Det oppstod en feil"); } clientWebSocket.onmessage = funksjon (feil) {console.log ("clientWebSocket.onmessage", clientWebSocket, feil); hendelser (feildata); } funksjonshendelser (responsEvent) {document.querySelector (". events"). innerHTML + = responsEvent + "

"; }

Når WebSocket-serveren er i gang, og åpner denne HTML-filen i en nettleser (f.eks. Chrome, Internet Explorer, Mozilla Firefox osv.), Bør vi se hendelsene som skrives ut på skjermen, med en forsinkelse på 1 sekund per hendelse, som definert i vår WebSocket-server.

{"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. Konklusjon

Her har vi presentert et eksempel på hvordan du oppretter en WebSocket-kommunikasjon mellom server og klient ved å bruke Spring 5 Framework, implementere de nye reaktive funksjonene som tilbys av Spring Webflux.

Som alltid kan hele eksemplet finnes i GitHub-depotet vårt.


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