【问题标题】:Spring websocket - sendToUser from a cluster does not work from backup serverSpring websocket - 来自集群的sendToUser在备份服务器上不起作用
【发布时间】:2015-12-27 23:26:37
【问题描述】:

我们有一个配置了 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 队列名称更改为用户登录名而不是默认行为对我们有帮助吗?

【问题讨论】:

    标签: java spring websocket spring-websocket


    【解决方案1】:

    这可以通过a feature added in Spring Framework 4.2解决:

    跨服务器集群解析用户目的地

    用户注册中心可以使用特定的主题目的地广播和分享他们的内容。您可以通过为集群部署配置StompBrokerRelay 来进行设置;见setUserDestinationBroadcastsetUserRegistryBroadcast

    不要犹豫,在https://jira.spring.io 上发送反馈/改进请求!

    【讨论】:

    • 感谢您的回答 Brian,我尝试设置 setUserDestinationBroadcast 和 setUserRegistryBroadcast。我启动了 2 台服务器,如果用户最初登录到实例 1,实例 2 无法向实例 1 发送消息。似乎对 setUserDestinationBroadcast 和 setUserRegistryBroadcast 都进行了订阅,但似乎 instance2 没有为用户目标主题发布失败的消息。除了这两个参数之外,我还需要设置其他任何内容吗?
    猜你喜欢
    • 2015-01-16
    • 2019-12-23
    • 2020-05-15
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多