我们有一个配置了 spring websocket 的 spring mvc('spring-websocket',版本:'4.1.0.RELEASE')。
我们有一个执行以下代码的简单类:
@Autowired
private SimpMessagingTemplate template;
@Override
public void push(Long userId, Object message, WebsocketQueue queue) {
String loginName = this.userRepository.getLoginName(userId);
this.template.convertAndSendToUser(
loginName,
queue.getMapping(),
message);
}
这对于单个 tomcat(非集群环境)非常有效
我们面临的问题是在使用两个 tomcat 组成的集群时。
如果我们尝试将消息从实际登录的 Tomcat 推送给用户 - 它会起作用。
但是如果我们尝试从其他 tomcat 节点推送消息 - 它不会到达用户。
1)我们能做什么?
2)将 websocket 队列名称更改为用户登录名而不是默认行为对我们有帮助吗?
最佳答案
这可以通过 a feature added in Spring Framework 4.2 来解决:
Resolve user destinations across cluster of servers
用户注册表可以使用特定主题目标来广播和共享其内容。您可以通过为集群部署配置 StompBrokerRelay
来进行设置;请参阅setUserDestinationBroadcast和 setUserRegistryBroadcast .
请随时向 https://jira.spring.io 发送反馈/改进请求!
关于java - Spring websocket - 来自集群的 sendToUser 无法从备份服务器工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32861645/