如何在Spring Websockets中查找所有订阅主题的用户

20

在使用Spring Websockets制作诸如聊天应用之类的东西时,了解订阅任何给定主题的所有人很有用。例如,客户端显示的在线用户数据。

我知道我可以实现ApplicationListener并维护自己的“已连接用户”列表,但似乎库必须已经执行了这项工作。

获取来自库的活动订阅信息的推荐方法是什么(而不必在内存或数据库中维护自己的列表)?


你可以在这里查看我的答案:https://stackoverflow.com/questions/42923461/spring-boot-websockets-how-to-see-subscribers/51113021#51113021 - Alireza Naghizadeh
1个回答

3

你说得没错,你可以使用ApplicationContext events,但不幸的是这些事件涉及用户会话事件和代理事件——因此当用户订阅特定主题时,你将不会收到通知。

当使用SimpleBrokerMessageHandler时,您可以通过获取SubscriptionRegistry来实现。但是,请注意,SimpleMessageBroker不适用于生产环境。

如果您正在使用RabbitMQ,您可以从其REST API中获取该信息。

问题在于,这非常特定于代理实现,因此我想知道在Spring Framework中是否有这样的功能。您能否打开JIRA issue开始讨论?


您可以在“Spring Framework”(又称SPR)项目的“Messaging”组件中创建一个新问题。谢谢! - Brian Clozel
6
从4.1版本开始,我们还会发布订阅/取消订阅事件。http://docs.spring.io/spring-framework/docs/4.1.0.RC1/spring-framework-reference/html/websocket.html#websocket-stomp-appplication-context-events 这可能是最好的方法。 - Rossen Stoyanchev
1
一个ChannelInterceptor在"clientInboundChannel"上,基本上跟踪所有订阅/取消订阅STOMP消息。 - Rossen Stoyanchev
2
有一个问题,我将在生产代码中使用SimpleBrokerMessageHandler,它是否有线程?您说“SimpleMessageBroker不适用于生产环境。”。您能详细说明原因吗? - RMachnik
9
如果您的应用程序只有单个实例,那么它已经可以投入生产使用了。但如果您有多个应用程序实例,则无法在这些实例之间共享消息;这时候需要使用“真正”的消息代理如rabbitmq。请注意不要改变原意,让翻译更加通俗易懂。 - Brian Clozel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接