Gyors példa a tavaszi webhálózatok @SendToUser kommentárjára

1. Áttekintés

Ebben a gyors bemutatóban szemléltetni fogjuk hogyan küldhet üzenetet egy adott munkamenetnek vagy egy adott felhasználónak a Spring WebSockets használatával.

A fenti modul bemutatásához olvassa el ezt a cikket.

2. WebSocket konfiguráció

Először is nekünk kell konfigurálja az üzenetközvetítőt és a WebSocket alkalmazás végpontját:

@Configuration @EnableWebSocketMessageBroker nyilvános osztály A WebSocketConfig kiterjeszti az AbstractWebSocketMessageBrokerConfigurer {@Orride public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ topic /", "/ topic /", "; config.setApplicationDestinationPrefixes ("/ app"); } @Orride public void registerStompEndpoints (StompEndpointRegistry registry) {register.addEndpoint ("/ greeting"); }}

Val vel @EnableWebSocketMessageBroker mi lehetővé tette a bróker által támogatott üzenetküldést a WebSocket segítségével STOMP, amely a szövegorientált üzenetküldési protokoll streaming-jét jelenti. Fontos megjegyezni, hogy ezt a kommentárt a @ Konfiguráció.

Nem kötelező meghosszabbítani a AbstractWebSocketMessageBrokerConfigurer de a gyors példa érdekében könnyebb testre szabni az importált konfigurációt.

Az első módszerben felállítottunk egy egyszerű memória alapú üzenetközvetítőt, amely az előtaggal ellátott célállomásokon visszavitte az üzeneteket az ügyfélhez. "/téma" és „/ Queue”.

És a másodikban regisztráltuk a taposási végpontokat a következő helyen: "/üdvözlet".

Abban az esetben, ha engedélyezni akarjuk a SockJS-t, módosítanunk kell a regiszter részét:

register.addEndpoint ("/ üdvözlet"). withSockJS () paranccsal;

3. Szerezze be a munkamenet-azonosítót az elfogótól

Egyirányú a munkamenet-azonosító megszerzéséhez hozzárendel egy rugós interceptort, amely a kézfogás során aktiválódik, és az információkat a kérési adatokból szerzi be.

Ez az elfogó közvetlenül hozzáadható WebSocketConfig:

@Orride public void registerStompEndpoints (StompEndpointRegistry registry) {register .addEndpoint ("/ greeting") .setHandshakeHandler (new DefaultHandshakeHandler () {public boolean beforeHandshake (ServerHttpRequest request, ServerHttpResponse Weldback ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) kérés; HttpSession session = servletRequest .getServletRequest (). GetSession (); attributes.put ("sessionId", session.getId (}J) (}) (return); return. ; }

4. WebSocket végpont

Az 5.0.5. RELEASE tavasztól kezdődően nem szükséges testreszabni a fejlesztése miatt @SendToUser megjegyzés, amely lehetővé teszi számunkra, hogy üzenetet küldjünk egy felhasználói célállomásnak keresztül/ user / {sessionId} /…" inkább mint "/ user / {user} /…“.

Ez azt jelenti, hogy a kommentár a bemeneti üzenet munkamenet-azonosítójára támaszkodva működik, és gyakorlatilag választ küld a privát célhelynek a munkamenetre:

@Controller public class WebSocketController {@Autowired private SimpMessageSendingOperations messagingTemplate; privát Gson gson = new Gson (); @MessageMapping ("/ message") @SendToUser ("/ queue / response") public String processMessageFromClient (@Payload String üzenet, fő megbízó) a Kivételt dobja {return gson .fromJson (message, Map.class) .get ("name" ) .toString (); } @MessageExceptionHandler @SendToUser ("/ queue / hibák") public String handleException (dobható kivétel) {return kivétel.getMessage (); }}

Fontos megjegyezni, hogy @SendToUser azt jelzi, hogy egy üzenetkezelési módszer visszatérési értékét a-ként kell elküldeni Üzenet a megadottra rendeltetési hely (ek)/ user / {felhasználónév}.

5. WebSocket kliens

function connect () {var socket = new WebSocket ('ws: // localhost: 8080 / üdvözlet'); ws = Stomp.over (foglalat); ws.connect ({}, function (frame) {ws.subscribe ("/ user / queue / hibák", function (message) {alert ("Error" + message.body);}); ws.subscribe ("/ felhasználó / várólista / válasz ", függvény (üzenet) {riasztás (" Üzenet "+ üzenet.test);});}, függvény (hiba) {riasztás (" STOMP hiba "+ hiba);}); } function disconnect () {if (ws! = null) {ws.close (); } setConnected (hamis); console.log ("Leválasztva"); }

Egy új WebSocket a következőre mutat:/üdvözlet”A feltérképezéshez WebSocketConfiguration.

Amikor feliratkozunk az ügyfélre/ user / queue / hibák”És„/ felhasználó / várólista / válasz”Itt használjuk az utolsó szakasz megjegyzett információit.

Ahogy látjuk, @SendToUser mutat valahová "sor / hibák”, De az üzenetet a következő címre küldjük:/ user / queue / hibák“.

6. Következtetés

Ebben a cikkben azt kutattuk, hogyan küldhetünk üzenetet közvetlenül egy felhasználó vagy munkamenet-azonosító számára a Spring WebSocket segítségével

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.