【问题标题】:How does Spring WebSocket send message to a specific user?Spring WebSocket 如何向特定用户发送消息?
【发布时间】:2016-02-16 15:59:36
【问题描述】:

我正在阅读本书 Spring in Action 4 以通过 WebSocket 使用 STOMP 消息传递。

假设user destination prefix is set as "/user"如下:

registry.setUserDestinationPrefix("/user");

然后客户端使用以下 JavaScript 代码订阅目的地:

stomp.subscribe("/user/queue/notifications", handleNotifications);

然后在服务器上,the 客户端订阅的actual 目的地应该是从其会话派生,可能是这样的:

/queue/notifications-user6hr83v6t  --- (1)

然后我使用SimpMessagingTemplate 向该用户发送消息:

messaging.convertAndSendToUser( username, "/queue/notifications",
                           new Notification("You just got mentioned!"));

然后消息将像这样发送到目的地:

/user/<username>/queue/notifications  ---(2)

嗯,(1)(2) 两个目的地看起来不同,消息怎么会到达客户端?

【问题讨论】:

    标签: spring websocket stomp


    【解决方案1】:

    路径

    /user/<username>/queue/notifications 
    

    似乎是文档中使用的“逻辑”路径。它最初也是使用 convertAndSendToUser 方法创建的。然后将其翻译成技术格式,在这一行的 UserDestinationMessageHandler 类中完成

    UserDestinationResult result = this.destinationResolver.resolveDestination(message);
    

    例如。

    鉴于订阅:

    stompClient.subscribe('/user/queue/reply', function (greeting) { ...
    

    发送消息

    stompClient.send("/app/personal", ...
    

    并用

    拦截它
    @MessageMapping("/personal")
    public void personalMessage(SimpMessageHeaderAccessor headerAccessor, PoCRequestMessage message) {
    
        SimpMessageHeaderAccessor ha = SimpMessageHeaderAccessor
                .create(SimpMessageType.MESSAGE);
        ha.setSessionId(headerAccessor.getSessionId());
        ha.setLeaveMutable(true);
        PoCReplyMessage reply = new PoCReplyMessage("Personal Message" + message.getName());
        simpMessagingTemplate.convertAndSendToUser(headerAccessor.getSessionId(), "/queue/reply", reply, ha.getMessageHeaders());
    }
    

    目的地将被解析如下:

    source destination: /user/zojdn53y/queue/reply
    target destination: /queue/reply-userzojdn53y
    

    这就是最终目的地名称的解析方式。 目标目的地是所创建队列的真实名称(至少只要使用外部消息代理 - 没有针对简单的内存代理检查此名称,但我认为这将是相同的)。

    需要注意的重要一点是,当您想要使用未经身份验证的用户时(在试验 Websockets 时最常见的情况),您需要另外将消息头放在 convertAndSendToUser 方法中 - 这在

    Spring WebSocket @SendToSession: send message to specific session

    【讨论】:

    • 在成功创建 UserDestinationResult 后,我​​的订阅者列表为空,因此不会发送消息。有什么想法吗?我在这里有一个同样的问题 - stackoverflow.com/questions/49482735/…
    • 谢谢 - 这终于帮助了我 - 在看了很多不同的之后......现在只要我能让 @SendToUser 注释工作......
    • 是的,我做到了(终于)
    • 那么当一个用户(1.人)向另一个用户(2.人)和另一个用户(2.人)发送消息时,我们如何防止3.人能够订阅这个端点。 person) 订阅此端点?
    猜你喜欢
    • 2020-05-06
    • 2014-04-17
    • 1970-01-01
    • 2016-04-28
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多