我正在尝试使用相同的Spring Security用户连接两个会话,并使用Spring 4.2.4订阅相同的队列。我想为每个会话分别收到消息。使用@SendToUser
很容易,但在使用SimpMessagingTemplate.sendToUser(...)
时似乎并不那么简单 - 每个会话都会收到特定于其他会话的所有消息。
@SendToUser
的示例:
@Controller
public class TestController {
@MessageMapping("/queue/hello")
@SendToUser(value = "/queue/hello", broadcast = false)
public String test() {
return Integer.toString(new Random().nextInt());
}
}
SimpMessagingTemplate
的示例:
template.convertAndSendToUser("SessionUser{id=123}", "/queue/hello", "test");
我已经尝试在标题中添加sessionId
,例如在此主题中建议:
sending-error-message-in-spring-websockets
不幸的是,它在这个版本的Spring中没有帮助。
有没有人有任何想法?
答案 0 :(得分:0)
似乎在标题中设置会话ID仍然有效,但它必须是simpSessionId,而不是sessionId。我对问题所在的假设都是错误的。总而言之,我们可以使用这个重载方法:
simpMessagingTemplate.convertAndSendToUser("SessionUser{id=123}", "/queue/hello", "test", headers);
其中标题由:
创建private MessageHeaders createHeaders(String sessionId) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}
要访问simpSessionId,我们应该使用:
SimpMessageHeaderAccessor.getSessionId(message.getHeaders())
希望这对某人有用。