2016-04-26 18 views
1

Ich klonte ein Chat-Anwendungsprojekt, das Spring Boot Websocket auf GitHub verwendet. Hier ist Code:Wie Client-und Server-Mapping-Nachricht auf Spring Boot Websocket

@MessageMapping("/chat.private.{username}") 
public void filterPrivateMessage(@Payload ChatMessage message, @DestinationVariable("username") String username, Principal principal) { 

    message.setUsername(principal.getName()); 
    simpMessagingTemplate.convertAndSend("/user/" + username + "/exchange/amq.direct/chat.message", message); 
} 

Beispiel: Benutzername Variable ist: [email protected], bedeuten sie den Link zu für den Kunden abonniert sein sollte: /user/[email protected]/exchange /amq.direct/chat.message

Aber in Client-Code:

chatSocket = Stomp.over(new SockJS(url)); //use sockjs and stompjs 
chatSocket.subscribe("/user/exchange/amq.direct/chat.message" 

ich verstehe nicht, wie man die Anwendung kann senden, um Client zu korrigieren, wenn der Client die andere URL (ohne [email protected]) abhört. Kann mir jemand erklären?

Danke.

Antwort

2

Der Schlüssel ist das Präfix /user/ in der Subskriptions-URL, das von Spring transformiert wird, um die Nachricht an den bestimmten Benutzer zu senden. Es ist in dem User Destinations Abschnitt in der Dokumentation beschrieben:

Eine Anwendung kann Nachrichten sendet einen bestimmten Benutzer und Spring STOMP Unterstützung erkennt Ziele mit dem Präfix /user/ zu diesem Zweck Targeting. Ein Client könnte beispielsweise das Ziel /user/queue/position-updates abonnieren. Dieses Ziel wird von UserDestinationMessageHandler verarbeitet und in ein für die Benutzersitzung eindeutiges Ziel transformiert, z. /queue/position-updates-user123. Dies bietet die Möglichkeit, ein generisch benanntes Ziel zu abonnieren, während gleichzeitig keine Kollisionen mit anderen Benutzern, die dasselbe Ziel abonnieren, sichergestellt werden, so dass jeder Benutzer einzigartige Bestandspositions-Updates erhalten kann.