Spring引导websocket

时间:2016-04-26 06:57:35

标签: spring-boot stomp spring-websocket sockjs

我克隆了一个在github上使用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);
}

示例:用户名变量为: foo@gmail.com ,这意味着客户订阅的链接应为: / user / foo @gmail。 COM /交换/ amq.direct / chat.message

但在客户代码中:

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

我不明白如何将应用程序发送到正确的客户端,当客户端监听不同的URL时(不带foo@gmail.com)。 有人可以向我解释一下吗?

感谢。

1 个答案:

答案 0 :(得分:2)

密钥是订阅网址中的/user/前缀,Spring将对其进行转换,以便将消息传递给特定用户。它在文档中的User Destinations部分中进行了描述:

  

应用程序可以发送针对特定用户的消息,Spring的STOMP支持可识别以/user/为前缀的目标。例如,客户端可能订阅目标/user/queue/position-updates。该目的地将由UserDestinationMessageHandler处理并转换为用户会话唯一的目的地,例如, /queue/position-updates-user123。这样可以方便地订阅一般命名的目的地,同时确保不会与订阅同一目的地的其他用户发生冲突,这样每个用户都可以接收到唯一的库存位置更新。