私信 spring websocket
Posted
技术标签:
【中文标题】私信 spring websocket【英文标题】:private messages spring websocket 【发布时间】:2017-07-25 16:08:22 【问题描述】:我正在学习 spring websocket,但我一直在思考如何使用 @DestinationVariable("username")
向特定用户发送消息
这是我的代码
configuration
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketContextConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession>
@Override
protected void configureStompEndpoints(StompEndpointRegistry registry)
registry.addEndpoint("/ws-cfg").withSockJS();
@Override
public void configureMessageBroker(MessageBrokerRegistry registry)
registry.enableStompBrokerRelay("/queue/","/topic","/exchange/")
.setRelayHost("localhost");
registry.setApplicationDestinationPrefixes("/app");
控制器
@MessageMapping("/chat.private.username")
public void filterPrivateMessage(@Payload Message message, @DestinationVariable("username") String username, Principal principal)
this.simpMessagingTemplate.convertAndSendToUser(username, "/queue/chat.message", message);
客户端代码
var stomp = null;
stomp = Stomp.over(new SockJS("/ws-cfg"));
stomp.connect('guest', 'guest', function(frame)
stomp.subscribe("/user/queue/chat.message", function (frame)
dysplayMessage(JSON.parse(frame.body));
);
)
$("#sendMessage").click(function (event)
event.preventDefault();
var message = $('#text').val();
var username="user@gmail.com";// i am lost in this part, i supose this must be the @DestinationVariable("username")
destination = "/app/chat.private."+to;
stomp.send(destination, , JSON.stringify('text': message));
$('#text').val("");
);
我目前正在使用带有 Spring Security 的 websocket。如何在stomp.send
方法上设置@DestinationVariable("username")
。
提前致谢。
【问题讨论】:
【参考方案1】:查看这个 Spring WebSocket Chat 示例,其中包含您正在寻找的内容:https://github.com/salmar/spring-websocket-chat
【讨论】:
首先,感谢您,很高兴与您交谈!!!我正在基于该项目和您深入研究 Spring WebSockets 和 Spring WebSocket 从零到英雄进行学习。我不知道如何将用户名从 stomp.send 方法传递给控制器方法。我认为@DestinationVariable 引用的用户名来自spring security,但事实并非如此。请问有什么建议吗? @Sergi-Almar:我已经阅读了你的代码,它组织得很好,谢谢你的分享。我有这个看起来很明显的问题,创建@MessageMapping("/chat.private.username")
来发送私人消息是否为每个用户使用不同的 MQ 主题?例如,1000 个在线用户需要 1000 个主题吗?这么多主题的开销是多少?在内存和进程消耗的情况下。【参考方案2】:
目标变量从您发送的有效负载中填充。在您的情况下,您必须像这样包含它
stomp.send(destination, , JSON.stringify('text': message, 'username' : 'User1'));
另一个观察结果是您似乎没有设置 UserDestinationPrefix。您需要为 MessageBrokerRegistry 和 SimpMessagingTemplate 设置它。
【讨论】:
以上是关于私信 spring websocket的主要内容,如果未能解决你的问题,请参考以下文章