4

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

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

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

4

2 回答 2

2

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

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

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

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

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

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

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

随着时间的推移,这将在您的代理上创建大量主题,当用户离开时您不希望在这些主题上闲逛。如果它们已经不活动一段时间,您可以配置 ActiveMQ 以删除它们。

于 2013-05-30T09:44:37.250 回答
0

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

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

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

于 2013-05-30T09:14:27.443 回答