禁止在SimpMessagingTemplate中的convertAndSendToUser方法中广播

时间:2015-01-21 13:37:04

标签: spring-websocket

我正在使用Spring websocket实现。要向客户端发送消息,有两种方法:

1)使用@SendToUser注释
2)使用convertAndSendToUser

SimpMessagingTemplate方法

@SendToUser采用名为broadcast的布尔参数,如果设置为false,则将消息发布到当前会话。有没有办法在SimpMessagingTemplate中有这种行为。

4 个答案:

答案 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);
}