gpt4 book ai didi

spring - Spring WebSocket如何向特定用户发送消息?

转载 作者:行者123 更新时间:2023-12-02 01:03:52 26 4
gpt4 key购买 nike

我正在看书Spring in Action 4通过 WebSocket 处理 STOMP 消息传递。

假设用户目标前缀设置为“/user”如下:

registry.setUserDestinationPrefix("/user");

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

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

然后在服务器上,客户端订阅的实际目的地应该派生自其 session ,也许像这样:

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

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

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

然后消息将被发送到目的地,如下所示:

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

好吧,两个目的地(1)(2)看起来不同,消息如何到达客户端?

最佳答案

路径

/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 时),您需要另外将消息 header 放入 ConvertAndSendToUser 方法中 - 这在中进行了详细描述

Spring WebSocket @SendToSession: send message to specific session

关于spring - Spring WebSocket如何向特定用户发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com