私信 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的主要内容,如果未能解决你的问题,请参考以下文章

如何阅读Spring源码

面试宝典 spring基础面试必问

Spring-data-redis + Lettuce 如何使用 Pipeline

Spring Boot+Vue实现汽车租赁系统(毕设)

Spring配置类理解(Lite模式和Full模式)

Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用?