2016-04-26 38 views
1

我克隆了一个在github上使用spring boot websocket的聊天应用程序项目。 这里是代码:春季启动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); 
} 

实施例:用户名变量是:[email protected],它指的是链接到客户端订阅应该是:/user/[email protected]/exchange /amq.direct/chat.message

但在客户端代码:

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

我不知道如何向应用可以发送到正确的客户端,当客户端听不同的网址(没有[email protected])。 有人可以向我解释吗?

谢谢。

回答

2

关键是订阅url中的/user/前缀,它将被Spring转换为将消息传递给特定用户。它在User Destinations部分描述的文档:

应用程序可以发送针对特定用户的消息,以及Spring的STOMP支持识别与/user/前缀用于此目的的目的地。例如,客户可能会订阅目标/user/queue/position-updates。这个目的地将由UserDestinationMessageHandler处理,并转换成用户会话特有的目的地,例如, /queue/position-updates-user123。这提供了订购通用命名目的地的便利,同时确保与订阅相同目的地的其他用户没有冲突,以便每个用户可以接收独特的库存位置更新。