我有一些带有mina插座和码头腹板的骆驼路线。我能够向连接到websocket的所有客户端广播消息,但是如何向特定端点发送消息。如何维护所有连接客户端的列表,其中客户端ID为参考,以便我可以路由到特定客户端。那可能吗?我可以在URI中提到动态客户端吗?
或许我正在考虑这个错误,我需要在有源mq上创建主题并让客户订阅它。这意味着我为每个websocket客户端创建一个主题?并将消息路由到正确的主题。
我至少在这里的正确轨道上,你可以指出任何例子吗?谷歌没有帮助。
答案 0 :(得分:2)
您采取的方法取决于客户信息的敏感程度。与选择一个主题的缺点是,任何人都可以订阅主题没有选择,看看每个人的所有信息 - 要不要通常是一些
更好的方案是使用消息分发机制(Camel路由集),它充当websocket客户端和生成消息的系统之间的中介。此机制负责将消息从单个目标分发到客户端特定目标。我曾经使用过类似计划的几个银行网络前端。
为了使其工作,您首先为每个用户生成一个不同的令牌/ UUID;这在会话建立时呈现给用户(通常通过某种简档查询/消息)。 这是至关重要的是,UUID可以作为确定clientid的哈希来制定,而不是存储在数据库,因为它会使用所有的时间,你要确保这是迅速解决。
然后,用户使用该信息连接到使用该UUID作为后缀的特定主题。例如,订阅orderConfirmation
主题的两个用户将分别订阅他们自己的该主题版本:
clientA -> orderConfirmation.71jqsd87162iuhw78162wd7168
clientB -> orderConfirmation.76232hdwe7r23j92irjh291e0d
要跟踪“存在”的,你的客户就需要定期发送包含自己的clientId心跳消息,你的分配机制侦听一个众所周知的话题。客户端不应该能够订阅此主题以进行读取(请参阅ActiveMQ Security)。消息分发机制需要在内存中保留一个包含clientId的数据结构以及上次看到心跳的时间。
当由所述分配机构接收到消息时,它检查其接收到的消息确定clientid是否具有“活/本”会话中,确定客户机的UUID,并在相应的主题广播该消息。< / p>
随着时间的推移,这会在您的经纪商上创建大量主题,当用户离开时您不想闲逛。您可以将ActiveMQ配置为delete these if they have been inactive for some time。
答案 1 :(得分:0)
您绝对不希望为每个客户端创建单独的端点。 主题和使用选择器的订阅是解决它的一种优雅方式。 我会说最好的一个。
您需要单个主题,每个客户都会使用看起来像where clientId in ('${myClientId}', 'EVERYONE')
的选择器进行订阅。现在,当您要将消息发布到特定客户端时,将属性clientId设置为此客户端的ID。如果要广播,请将其设置为“每个人”
我希望我能正确理解这个问题......