在Spring 4.2.4中禁用SimpMessageTemplate.sentToUser(...)中的广播

时间:2016-05-28 14:19:34

标签: java spring websocket

我正在尝试使用相同的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中没有帮助。 有没有人有任何想法?

1 个答案:

答案 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())

希望这对某人有用。