Java 如何获取RabbitMQ中主题的订阅数

Java 如何获取RabbitMQ中主题的订阅数,java,rabbitmq,stomp,spring-websocket,Java,Rabbitmq,Stomp,Spring Websocket,我有一个聊天应用程序,它是使用springwebsokcets(带STOMP)构建的,我使用的消息代理是RabbitMQ 首先,我将尝试解释一下流程。在我的应用程序中,同一用户可以从不同的设备连接到websocket服务器。为了简单起见,每个用户都是/topic/{userId}的订户。因此,当有人向用户123发送消息时,他将能够在他连接的所有设备中看到该消息,因为我只是将该消息发送到目标/topic/{userId} 我的问题是,在向特定的主题发送消息之前,我想检查此时有多少用户连接了此主题(

我有一个聊天应用程序,它是使用
springwebsokcets(带STOMP)
构建的,我使用的消息代理是
RabbitMQ

首先,我将尝试解释一下流程。在我的应用程序中,同一用户可以从不同的设备连接到websocket服务器。为了简单起见,每个用户都是
/topic/{userId}
的订户。因此,当有人向用户
123
发送消息时,他将能够在他连接的所有设备中看到该消息,因为我只是将该消息发送到目标
/topic/{userId}

我的问题是,在向特定的
主题
发送消息之前,我想检查此时有多少用户连接了此
主题
(此数字指定用户登录的设备数量)。如果此号码为
0
,我想将此消息发送到单独的队列

我检查了问题,它们看起来和我的问题非常相似。但我相信我的问题更简单。我只想知道用户的数量,我不需要任何关于他们的信息

在我上面提到的问题中,Brian Clozel提到可以从RabbitMQ REST API获取有关订阅的信息,我已经搜索了如何做到这一点

如果我想知道订阅主题
/topic/123
的用户数量,我如何使用RabbitMQ API找到它

我还检查了这个问题,似乎对这个用例有额外的支持,但据我所知,它只适用于
SimpleMessageBroker
。有人能澄清一下我是否正确吗

我可以使用
应用程序上下文事件
实现这一点,但这只适用于单个服务器。在分布式系统中,这将不起作用。所以我认为从RabbiMQ获取信息是正确的方法

更新

让我更清楚地解释一下我想做什么。假设我是一个用户ID为123的用户,如果我是从三个设备登录到该站点的
Laptop1
Laptop2
Mobile1
。最初,他们都将订阅
/topic/123
123
是这里的用户ID)

基本上我想解决两个问题:

1)即使用户处于非活动状态,我也不想让websocket连接保持打开状态,因此我会在一段非活动时间后关闭websocket连接。实际上,即使手机处于非活动状态,它也应该能够获取通知,因此我的应用程序将ping一个
通知服务器
,以获取通知(不仅仅是消息,任何类型的通知)。如果我知道没有消费者连接到
/topic/123
,并且用户
123
安装了我们的应用程序,那么现在假设有一条
123
的传入消息(不知何故我会知道此信息)我想将此消息发送到
通知服务器
,这样即使关闭了websocket连接,移动应用程序也可以获取消息


2)第二个问题是,假设所有三个连接(
Laptop1
Laptop2
Mobile1
)都处于活动状态,并且有传入的消息,我只想在一个活动客户端中显示通知(就像Gmail或Facebook那样)。如果有一条传入消息发送到客户端,并且它知道有多个设备(我可以从服务器发送此信息)订阅了
/topic/123
,则在客户端,我可以决定是否显示弹出窗口。

鉴于您的应用程序中需要的功能,您将需要RabbitMQ前面的东西—一个web服务器或其他应用程序服务器,可以承载您的WebSocket,并提供所需的逻辑

RabbitMQ将根据路由密钥将消息传递到队列。连接到队列的任何使用者都有机会接收消息。如果有多个使用者连接到队列,RabbitMQ会将消息循环发送给使用者。除非给定队列中只有一个使用者,否则无法保证特定使用者将收到特定消息

只需要向单个连接的设备发送通知意味着设备列表的优先顺序-哪个更重要,应该接收通知。优先顺序似乎是动态的,取决于您的需求。。。用户在给定设备上的活动程度将改变该设备是否应接收通知

这种类型的逻辑在RabbitMQ中实际上不可能直接实现


我建议构建一个位于RabbitMQ前面的web服务器,并让您的所有设备连接到该web服务器。使用web服务器简化web套接字,并让web服务器跟踪给定用户最活跃的设备。web服务器可以使用这些知识来确定哪个设备接收通知。

鉴于您希望在应用程序中使用的功能,您需要在RabbitMQ前面安装一些东西—一个web服务器或其他可以承载WebSocket并提供所需逻辑的应用程序服务器

RabbitMQ将根据路由密钥将消息传递到队列。连接到队列的任何使用者都有机会接收消息。如果有多个使用者连接到队列,RabbitMQ会将消息循环发送给使用者。除非给定队列中只有一个使用者,否则无法保证特定使用者将收到特定消息

只需要向单个连接的设备发送通知意味着设备列表的优先顺序-哪个更重要,应该接收通知。优先顺序似乎是dyna