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