我正在使用Spring websocket实现。要向客户端发送消息,有两种方法:
1)使用@SendToUser
注释
2)使用convertAndSendToUser
SimpMessagingTemplate
方法
@SendToUser
采用名为broadcast
的布尔参数,如果设置为false,则将消息发布到当前会话。有没有办法在SimpMessagingTemplate
中有这种行为。
答案 0 :(得分:7)
如果我们查看SendToMethodReturnValueHandler
源代码,我们会看到:
if (broadcast) {
this.messagingTemplate.convertAndSendToUser(user, destination, returnValue);
}
else {
this.messagingTemplate.convertAndSendToUser(user, destination, returnValue, createHeaders(sessionId));
}
因此,您的用例所需要的只是使用重载的convertAndSendToUser
并提供Map
和`sessionId:
messagingTemplate.convertAndSendToUser(user, destination, payload,
Collections.singletonMap(SimpMessageHeaderAccessor.SESSION_ID_HEADER, sessionId))
答案 1 :(得分:2)
Spring没有明确的文档,我尝试了很多不同的方式,只有下面的代码才适合我。
SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.create();
accessor.setHeader(SimpMessageHeaderAccessor.SESSION_ID_HEADER, sessionId);
messagingTemplate.convertAndSendToUser(sessionId, destination, payload, accessor.getMessageHeaders());
答案 2 :(得分:1)
上面的答案对我不起作用。事实证明,使用Spring 4.1.4需要稍微不同的东西。
对我来说最干净的方式如下:
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create();
headerAccessor.setSessionId(cmd.getSessionId());
headerAccessor.setLeaveMutable(true);
MessageHeaders messageHeaders = headerAccessor.getMessageHeaders();
messagingTemplate.convertAndSendToUser(cmd.getPrincipal().getName(),
"/queue/responses", ret, messageHeaders);
另一种方法是将“nativeHeaders”值显式添加到发送到SimpMessagingTemplate.convertAndSendToUser()的Map中。但是,这种方式似乎过分依赖于实现细节:
Map<String, Object> headers = new HashMap<>();
headers.put("nativeHeaders", new HashMap<String, Object>());
headers.put(SimpMessageHeaderAccessor.SESSION_ID_HEADER, cmd.getSessionId());
messagingTemplate.convertAndSendToUser(cmd.getPrincipal().getName(),
"/queue/responses", ret, headers);
设置“simpSessionId”标题并且Map中没有其他内容的“违规代码”在SimpMessagingTemplate.processHeaders()和MessageHeaderAccessor.getAccessor(MessageHeaders,Class requiredType)中。
答案 3 :(得分:1)
通过 SimpMessagingTemplate
发送给用户的最简单方法@Autowired
private SimpMessagingTemplate messagingTemplate;
@MessageMapping("/getHello")
public void sendReply( MessageHeaders messageHeaders, @Payload String message, @Header(name = "simpSessionId") String sessionId){
messagingTemplate.convertAndSendToUser(sessionId, "/queue/hello", "Hello "+ message, messageHeaders);
}