您采用的方法取决于客户信息的敏感程度。带有选择器的单个主题的缺点是任何人都可以在没有选择器的情况下订阅该主题并查看每个人的所有信息 - 通常不是您想要做的事情。
更好的方案是使用消息分发机制(一组 Camel 路由),充当 websocket 客户端和生成消息的系统之间的中介。此机制负责将消息从单个目的地分发到特定于客户端的目的地。我曾在几个使用类似方案的银行 Web 前端工作过。
为了使它起作用,您首先为每个用户生成一个不同的令牌/UUID;这在会话建立时呈现给用户(通常通过某种配置文件查询/消息)。UUID 可以作为 clientId 的散列而不是存储在数据库中,这一点很重要,因为它将一直使用,并且您希望确保快速解决这个问题。
然后,用户使用该信息连接到使用该 UUID 作为后缀的特定主题。例如,订阅一个orderConfirmation
主题的两个用户将各自订阅他们自己版本的该主题:
clientA -> orderConfirmation.71jqsd87162iuhw78162wd7168
clientB -> orderConfirmation.76232hdwe7r23j92irjh291e0d
要跟踪“存在”,您的客户端需要定期向您的分发机制侦听的知名主题发送包含其 clientId 的心跳消息。客户端不应订阅此主题以进行读取(请参阅ActiveMQ 安全性)。消息分发机制需要在内存中保存一个包含 clientId 和最后一次看到心跳的时间的数据结构。
当分发机制接收到消息时,它会检查它接收到的消息的 clientID 是否具有“live/present”会话,确定客户端的 UUID,并在适当的主题上广播消息。
随着时间的推移,这将在您的代理上创建大量主题,当用户离开时您不希望在这些主题上闲逛。如果它们已经不活动一段时间,您可以配置 ActiveMQ 以删除它们。