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());
终于找到问题了。我犯了一个愚蠢的错误。我将 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 前缀。
我是 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());
终于找到问题了。我犯了一个愚蠢的错误。我将 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 前缀。