【问题标题】:Camel route "to" specific websocket endpoint骆驼路线“到”特定的 websocket 端点
【发布时间】:2013-05-09 17:25:13
【问题描述】:

我有一些带有 mina 套接字和码头 websockets 的骆驼路线。我能够向连接到 websocket 的所有客户端广播消息,但是如何将消息发送到特定端点。我如何维护所有已连接客户端的列表,并以客户端 ID 作为参考,以便我可以路由到特定客户端。那可能吗?我可以在 to URI 中提及动态客户端吗?

或者也许我正在考虑这个错误,我需要在活动 mq 上创建主题并让客户订阅它。这意味着我为每个 websocket 客户端创建一个主题?并将消息路由到正确的主题。

我至少在正确的轨道上,你能指出任何例子吗?谷歌没有帮助。

【问题讨论】:

    标签: activemq apache-camel


    【解决方案1】:

    您采取的方法取决于客户信息的敏感程度。带有选择器的单个主题的缺点是任何人都可以在没有选择器的情况下订阅该主题并查看每个人的所有信息 - 通常不是您想要做的事情。

    更好的方案是使用消息分发机制(一组 Camel 路由),充当 websocket 客户端和生成消息的系统之间的中介。该机制负责将消息从单个目的地分发到特定于客户端的目的地。我曾开发过几个使用类似方案的银行 Web 前端。

    为了让这个工作你首先为每个用户生成一个不同的令牌/UUID;这在会话建立时呈现给用户(通常通过某种配置文件查询/消息)。 UUID 可以作为 clientId 的散列而不是存储在数据库中,这一点很重要,因为它将一直使用,并且您希望确保快速解决这个问题。

    然后,用户使用该信息连接到使用该 UUID 作为后缀的特定主题。例如,订阅 orderConfirmation 主题的两个用户将分别订阅他们自己版本的该主题:

    clientA -> orderConfirmation.71jqsd87162iuhw78162wd7168
    clientB -> orderConfirmation.76232hdwe7r23j92irjh291e0d
    

    要跟踪“存在”,您的客户端需要定期向您的分发机制侦听的知名主题发送包含其 clientId 的心跳消息。客户端不应订阅此主题以进行读取(请参阅ActiveMQ Security)。消息分发机制需要在内存中保存一个数据结构,其中包含 clientId 和最后一次看到心跳的时间。

    当分发机制接收到消息时,它会检查它接收到的消息的 clientID 是否具有“live/present”会话,确定客户端的 UUID,并在适当的主题上广播消息。

    随着时间的推移,这将在您的代理上创建大量主题,您不希望在用户离开时闲逛这些主题。您可以将 ActiveMQ 配置为delete these if they have been inactive for some time

    【讨论】:

      【解决方案2】:

      您绝对不想为每个客户端创建单独的端点。 主题和带有选择器的订阅是解决它的一种优雅方式。 我会说最好的。

      您需要单个主题,每个客户端都会使用看起来像 where clientId in ('${myClientId}', 'EVERYONE') 的选择器订阅该主题。现在,当您想向特定客户端发布消息时,您可以将属性 clientId 设置为该客户端的 id。如果要广播,请将其设置为“所有人”

      希望我能正确理解问题...

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 2018-09-05
        • 2020-02-07
        • 2011-05-24
        • 1970-01-01
        相关资源
        最近更新 更多