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.