Spring WebSocket ConvertAndSendToUser 不工作但 convertAndSend 工作

Spring WebSocket ConvertAndSendToUser not working but convertAndSend working

我是 Spring 引导 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);
}) 

它没有被发送,因为你的 "destination" 即 "queuename" 不正确。 正如您在此处看到的那样 SimpMessagingTemplate.java#L230,这是作为 template.convertAndSendToUser() 调用链的一部分被调用的方法。

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

我有一个类似的问题,如果你的username实际上是一个sessionId,那么尝试使用接受headers的重载方法之一([=13中说的) =] javadoc):

SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(username);
headerAccessor.setLeaveMutable(true);

messagingTemplate.convertAndSendToUser(username, "/queue/wishes", message, headerAccessor.getMessageHeaders());

my example

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

您必须注册 SimpleBroker 的前缀:

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

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