Stručný príklad anotácie @SendToUser od spoločnosti Spring Websockets
1. Prehľad
V tomto rýchlom výučbe ukážeme ako poslať správu konkrétnej relácii alebo konkrétnemu používateľovi pomocou Spring WebSockets.
Úvod do vyššie uvedeného modulu nájdete v tomto článku.
2. Konfigurácia WebSocket
V prvom rade musíme nakonfigurujte nášho sprostredkovateľa správ a koncový bod aplikácie WebSocket:
@Configuration @EnableWebSocketMessageBroker verejná trieda WebSocketConfig rozširuje AbstractWebSocketMessageBrokerConfigurer {@Override public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ topic /", "/ queue /") config.setApplicationDestinationPrefixes ("/ app"); } @Override public void registerStompEndpoints (register StompEndpointRegistry) {registry.addEndpoint ("/ pozdrav"); }}
S @EnableWebSocketMessageBroker my povolila sprostredkovanie správ podporovaných cez WebSocket pomocou STOMP, čo je skratka pre Streaming Text Oriented Messaging Protocol. Je dôležité poznamenať, že túto anotáciu je potrebné používať v spojení s @ Konfigurácia.
Nie je povinné rozširovať AbstractWebSocketMessageBrokerConfigurer pre rýchly príklad je však jednoduchšie prispôsobiť importovanú konfiguráciu.
V prvej metóde sme nastavili jednoduchého sprostredkovateľa správ založeného na pamäti, ktorý prenáša správy späť ku klientovi na cieľových miestach s predponou „/ Topic“ a „/ Fronta“.
A v druhej sme zaregistrovali koncové body dupnutia na „/ Pozdrav“.
V prípade, že chceme povoliť SockJS, musíme upraviť časť registra:
registry.addEndpoint ("/ pozdrav"). withSockJS ();
3. Získajte ID relácie pomocou zachytávača
Jednosmerka na získanie ID relácie pridáva Spring Interceptor, ktorý sa spustí počas podania ruky a získa informácie z údajov žiadosti.
Tento zachytávač je možné pridať priamo do WebSocketConfig:
@Override public void registerStompEndpoints (register StompEndpointRegistry) {register .addEndpoint ("/ pozdrav") .setHandshakeHandler (nový DefaultHandshakeHandler () {public boolean beforeHandshake (požiadavka ServerHttpRequest, požiadavka ServerHttpResponand, odpoveď WebSocks), WebSocks ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) požiadavka; HttpSession session = servletRequest .getServletRequest (). GetSession (); attributes.put ("sessionId", session.getId ());} return true;}) ; }
4. Koncový bod WebSocket
Počnúc jarom 5.0.5.RELEASE nie je potrebné robiť žiadne prispôsobenia z dôvodu vylepšenia @SendToUser anotácia, ktorá nám umožňuje poslať správu do cieľového miesta používateľa cez "/ user / {sessionId} /…" radšej než "/ user / {user} /…“.
To znamená, že anotácia funguje na základe ID relácie vstupnej správy a efektívne tak odosiela odpoveď do cieľového miesta súkromného pre reláciu:
@Controller verejná trieda WebSocketController {@Autowired private SimpMessageSendingOperations messagingTemplate; súkromný Gson gson = nový Gson (); @MessageMapping ("/ message") @SendToUser ("/ queue / response") public String processMessageFromClient (@Payload String message, Principal principal) vyvolá Exception {return gson .fromJson (message, Map.class) .get ("name" ).natiahnuť(); } @MessageExceptionHandler @SendToUser ("/ queue / errors") public String handleException (Throwable exception) {return exception.getMessage (); }}
Je dôležité poznamenať, že @SendToUser označuje, že návratová hodnota metódy spracovania správ by mala byť odoslaná ako Správa do zadaného cieľ (y) doplnené o „/ user / {username}“.
5. Klient WebSocket
function connect () {var socket = new WebSocket ('ws: // localhost: 8080 / pozdrav'); ws = Stomp.over (zásuvka); ws.connect ({}, function (frame) {ws.subscribe ("/ user / queue / errors", function (message) {alert ("Error" + message.body);}); ws.subscribe ("/ používateľ / fronta / odpoveď ", funkcia (správa) {alert (" Správa "+ message.body);});}, funkcia (chyba) {alert (" chyba STOMP "+ chyba);}); } funkcia odpojit () {if (ws! = null) {ws.close (); } setConnected (false); console.log ("Odpojené"); }
Nový WebSocket je vytvorené a ukazuje na „/ pozdrav”Pre mapovanie v WebSocketConfiguration.
Keď klienta prihlásime na odber/ user / queue / errors“A„/ užívateľ / fronta / odpoveď”, Kde používame poznamenané informácie z poslednej časti.
Ako vidíme, @SendToUser ukazuje na "poradie / chyby„Ale správa bude odoslaná na„/ user / queue / errors“.
6. Záver
V tomto článku sme sa zaoberali spôsobom, ako poslať správu priamo používateľovi alebo identifikácii relácie pomocou Spring WebSocket
Celý zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.