【问题标题】:Spring websocket - send messages to user destinations from outside the websocket serverSpring websocket - 从websocket服务器外部向用户目的地发送消息
【发布时间】:2017-02-17 08:27:45
【问题描述】:

用例

我有一个 tomcat REST 应用程序,它充当它背后的许多其他应用程序的 API 网关。我想为 tomcat 应用程序添加 websocket 支持,以便为每个用户会话发送通知更新。这些通知更新将来自其他应用程序之一,该应用程序没有用户会话上下文,但知道应该向哪个用户发送更新(如果此用户当前有一个打开的会话)。

所以要明确一点 - 我只想要一个 websocket 服务器和一个(或多个)应用程序,它们只生成要发送到用户会话的消息。

我的研究

我很清楚我必须使用带有 STOMP 的full featured broker support 作为子协议。我们已经使用 rabbit 进行通信,所以它是显而易见的选择。

文档指出“STOMP 代理中继还为每个连接的 WebSocket 客户端创建一个单独的 TCP 连接。” 这是每个用户会话的单独连接,而不是每个用户。此外,当发送端位于同一个应用程序(负责处理用户会话的应用程序)中时,每个会话都会创建一个单独的队列。我想我其他想要发送消息的应用程序必须以某种方式知道当前活动的会话并将消息发送到代理的相应队列。

我发现的可能解决方案

Spring Jira 中的这个issue 或多或少与我的问题有关。一种可能的解决方案是实现分布式 UserSessionRegistry。

另一种方法是使用提供的选项作为解决同一问题的方法 - 启用具有未解决的用户目的地的广播消息。但在这种情况下,我所有的应用程序都会收到这些广播消息。而且我只希望前面提到的 API 网关应用程序接收它们(它将是唯一暴露给客户端并打开和关闭用户会话的应用程序)。

那么,解决这个问题的正确方法是什么?

【问题讨论】:

    标签: java spring stomp spring-websocket


    【解决方案1】:

    我想为 tomcat 应用程序添加 websocket 支持

    “tomcat 应用程序”是 Tomcat REST API 网关?我不明白为什么需要一个功能齐全的经纪人,或者至少看起来不相关。

    发起更新的应用程序服务器需要某种方式来通知网关/websocket 服务器,然后网关/websocket 服务器将消息广播给订阅者。网关/webSocket 可以接受通过 HTTP 的调用,即一个普通的@RequestMapping 方法,通过SimpMessagingTemplate 广播处理请求。

    【讨论】:

    • 好吧,我认为全功能代理是相关的,因为我希望将其用于从其他应用程序发送更新。但你是对的 - 我需要它来处理与我的问题无关的东西(即支持 ACK/NACK 帧)。最终你的提议浮现在我的脑海,感谢你的确认。
    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 2018-07-05
    • 2018-10-25
    • 2022-09-28
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多