【问题标题】:Spring Websocket convertAndSendToUser doesn't workSpring Websocket convertAndSendToUser 不起作用
【发布时间】:2021-03-15 14:34:36
【问题描述】:

我成功订阅了一个队列,但是发送消息时,另一个用户没有收到它

消息代理配置:

override fun configureMessageBroker(config: MessageBrokerRegistry) {
    config.enableSimpleBroker("/queue", "/topic")
    config.setApplicationDestinationPrefixes("/app")
}

我如何发送消息

messageTemplate.convertAndSendToUser(recipientId.toString(), "/queue/chat", message)

在 ws 连接上创建自定义用户主体

override fun preSend(message: Message<*>, channel: MessageChannel): Message<*>? {
            val accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor::class.java)
            if (accessor != null && StompCommand.CONNECT == accessor.command) {
                val customPrincipal = CustomPrincipal(userId)
                val authentication = CustomAuthToken(customPrincipal, roles)
                accessor.user = authentication
                return MessageBuilder.createMessage(message.payload, accessor.messageHeaders)
            }
            return message
        }
    }

在客户端我连接套接字

this.stompClient.connect(headers, () => {
    this.stompClient.subscribe(headers, "/user/queue/chat", (message) => {
        console.log("connected");
        console.log(message);
    });
});

当我连接到 stomp 时,我会在浏览器控制台中看到下一条消息

<<< CONNECTED
user-name:1
heart-beat:0,0
version:1.2
content-length:0

user-name 是该用户的实际 ID
我将 ID 为 1 的用户和 ID 为 2 的用户订阅到同一个队列,当我从用户 1 向用户 2 发送消息时,第二个用户没有收到它。
我错过了什么吗?

【问题讨论】:

    标签: spring spring-boot websocket spring-websocket


    【解决方案1】:

    在调试 Spring 5 小时后,我找到了解决此问题的方法

    只需设置访问器(在preSend 方法中)不可变

    accessor.setLeaveMutable(false)
    

    仍然不完全理解为什么会发生这种情况,如果有人能解释一下会很有用
    我在文档中没有找到任何关于此的内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2018-10-02
      • 1970-01-01
      • 2018-02-11
      • 2018-09-16
      • 2014-09-14
      • 2021-10-24
      相关资源
      最近更新 更多