【问题标题】:Spring WebSocket ConvertAndSendToUser not working but convertAndSend workingSpring WebSocket ConvertAndSendToUser 不工作但 convertAndSend 工作
【发布时间】:2020-06-18 17:44:44
【问题描述】:

我是 Spring Boot websocket 和消息语义的新手。目前我可以使用以下代码发送私人消息。

String queueName = "/user/" + username  + "/queue/wishes";
simpMessagingTemplate.convertAndSend(queueName, message);

当尝试使用 convertAndSendToUser 时,我没有收到任何错误,但没有发送消息。我知道使用 sendToUser 应该会稍微改变目标名称的形成方式,但我没有做对。

String queueName = "/user/queue/wishes";
simpMessagingTemplate.convertAndSendToUser(username, queueName, message);

下面是我的订阅代码。

stompClient.subscribe('/user/queue/wishes', function(message) {
    alert(message);
}) 

【问题讨论】:

    标签: java spring-websocket stomp


    【解决方案1】:

    我遇到了类似的问题,如果您的username 实际上是sessionId,那么尝试使用接受标头的重载方法之一(在SimpMessageSendingOperations javadoc 中这么说):

    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(username);
    headerAccessor.setLeaveMutable(true);
    
    messagingTemplate.convertAndSendToUser(username, "/queue/wishes", message, headerAccessor.getMessageHeaders());
    

    my example

    【讨论】:

      【解决方案2】:

      它没有被发送,因为你的“目的地”,即“队列名”不正确。 正如您在这里看到的SimpMessagingTemplate.java#L230,这是在调用template.convertAndSendToUser() 时作为链的一部分被调用的方法。

      此方法已将 /user 前缀到最终目的地。因此,您应该这样做: simpMessagingTemplate.convertAndSendToUser(username,"/queue/wishes", message); 现在有了正确的目的地,它应该被发送给用户。

      【讨论】:

      • 没有。它仍然无法正常工作。最初,我最终将“/user”添加到目的地,但它不适用于“/queue/wishes”目的地。
      【解决方案3】:

      终于找到问题所在了。我犯了一个愚蠢的错误。我正在填写 User DestinationPrefix 作为 WebSocket 配置的一部分。但没有为注入的 bean SimpMessaging 模板设置它。

      【讨论】:

        【解决方案4】:

        必须注册SimpleBroker的前缀:

        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            registry.setApplicationDestinationPrefixes("/app");
            registry.enableSimpleBroker("/topic", "/queue", "/user");
            registry.setUserDestinationPrefix("/user");
        }
        

        虽然 UserDestinationPrefix 已设置为默认值“/user/”,但您必须添加 SimpleBroker 前缀。

        【讨论】:

          猜你喜欢
          • 2021-03-15
          • 2022-08-18
          • 1970-01-01
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          • 2018-07-27
          • 2020-04-03
          • 2017-10-11
          相关资源
          最近更新 更多