Et raskt eksempel på Spring Websockets ’@SendToUser Annotation

1. Oversikt

I denne raske opplæringen skal vi illustrere hvordan du sender en melding til en bestemt økt eller en bestemt bruker ved hjelp av Spring WebSockets.

For en introduksjon til ovennevnte modul, se denne artikkelen.

2. WebSocket-konfigurasjon

Først og fremst må vi konfigurer meldingsmegleren og endepunktet for applikasjonen WebSocket:

@Configuration @EnableWebSocketMessageBroker offentlig klasse WebSocketConfig utvider AbstractWebSocketMessageBrokerConfigurer {@Override public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ topic /", "/ queue /") config.setApplicationDestinationPrefixes ("/ app"); } @ Override public void registerStompEndpoints (StompEndpointRegistry registry) {registry.addEndpoint ("/ greeting"); }}

Med @EnableWebSocketMessageBroker vi aktivert en meglerstøttet melding via WebSocket ved hjelp av STOMP, som står for Streaming Text Oriented Messaging Protocol. Det er viktig å merke seg at denne merknaden må brukes i forbindelse med @Konfigurasjon.

Det er ikke obligatorisk å utvide AbstractWebSocketMessageBrokerConfigurer men for det korte eksemplet er det lettere å tilpasse den importerte konfigurasjonen.

I den første metoden satte vi opp en enkel minnebasert meldingsmegler for å føre meldingene tilbake til klienten på destinasjoner foran "/emne" og "/kø".

Og i det andre registrerte vi stomp-endepunkter på "/hilsen".

I tilfelle vi ønsker å aktivere SockJS, må vi endre registerdelen:

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

3. Få økt-ID av Interceptor

En vei for å få økt-ID legger til en Spring Interceptor som vil utløses under håndtrykket og få informasjonen fra forespørselsdataene.

Denne avskjæreren kan legges til direkte i WebSocketConfig:

@Override public void registerStompEndpoints (StompEndpointRegistry registry) {registry .addEndpoint ("/ greeting") .setHandshakeHandler (new DefaultHandshakeHandler () {public boolean beforeHandshake (ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler ws Attributes) ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) forespørsel; HttpSession-økt = servletRequest .getServletRequest (). GetSession (); attributter.put ("sessionId", session.getId ());} returner sant;} J ; }

4. WebSocket sluttpunkt

Fra og med våren 5.0.5.RELEASE, er det ikke nødvendig å gjøre noen tilpasninger på grunn av forbedringen av @SendToUser merknad, som lar oss sende en melding til et brukermål via “/ bruker / {sessionId} /…" heller enn "/ bruker / {bruker} /…“.

Det betyr at merknaden fungerer avhengig av økt-ID for inngangsmeldingen, og effektivt sender et svar til destinasjonen privat til økten:

@Controller offentlig klasse WebSocketController {@Autowired private SimpMessageSendingOperations messagingTemplate; privat Gson gson = ny Gson (); @MessageMapping ("/ melding") @ SendToUser ("/ kø / svar") offentlig strengprosessMessageFromClient (@Payload strengemelding, rektor) kaster unntak {returner gson .fromJson (melding, Map.class) .get ("navn" ) .toString (); } @MessageExceptionHandler @SendToUser ("/ kø / feil") offentlig streng handleException (kaste unntak) {return exception.getMessage (); }}

Det er viktig å bemerke at @SendToUser indikerer at returverdien til en meldingshåndteringsmetode skal sendes som en Beskjed til det angitte destinasjon (er) forhåndsbetalt med “/ bruker / {brukernavn}.

5. WebSocket-klient

function connect () {var socket = new WebSocket ('ws: // localhost: 8080 / greeting'); ws = Stomp.over (stikkontakt); ws.connect ({}, funksjon (ramme) {ws.subscribe ("/ bruker / kø / feil", funksjon (melding) {alert ("Feil" + message.body);}); ws.subscribe ("/ bruker / kø / svar ", funksjon (melding) {varsel (" Melding "+ melding. kropp);});}, funksjon (feil) {varsel (" STOMP-feil "+ feil);}); } funksjonsfrakobling () {if (ws! = null) {ws.close (); } setConnected (false); console.log ("Frakoblet"); }

En ny WebSocket er opprettet og peker på “/hilsen”For kartleggingen i WebSocketConfiguration.

Når vi abonnerer på klienten “/ bruker / kø / feil”Og”/ bruker / kø / svar”Er der vi bruker den bemerkede informasjonen fra forrige avsnitt.

Som vi kan se, @SendToUser poeng til "kø / feil”Men meldingen vil bli sendt til“/ bruker / kø / feil“.

6. Konklusjon

I denne artikkelen har vi utforsket en måte å sende en melding direkte til en bruker eller økt-ID med Spring WebSocket

Som alltid er hele kildekoden til eksemplene tilgjengelig på GitHub.


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