Spring WebSocket的ConvertAndSendToUser方法无效,但ConvertAndSend方法有效

3

我对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);
}) 
4个回答

4

我曾经遇到过类似的问题,如果你的用户名实际上是一个会话ID,那么请尝试使用其中一个可以接受头信息的重载方法(在SimpMessageSendingOperations的javadoc中有提到):

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

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

我的示例


0

你必须注册SimpleBroker的前缀:

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

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


0

消息未发送是因为您的“目标”即“队列名称”不正确。 如您在SimpMessagingTemplate.java#L230中所见,这是在调用template.convertAndSendToUser()时作为调用链的一部分而被调用的方法。

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


不行,还是不起作用。最终我在目标地址后面添加了“/user”,因为一开始使用“/queue/wishes”目标地址时它没有起作用。 - Harsha

-1
最后找出了问题。我犯了一个愚蠢的错误。我在WebSocket配置中填写了用户目标前缀,但没有为注入的bean SimpMessagingTemplate设置它。

1
请您在回答中分享解决方案。 - Vivek Buddhadev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接