java - Spring WebSocket : broadcasting messages to users

标签 java spring spring-boot spring-websocket

我正在实现一个简单的 Spring Boot 应用程序,该应用程序具有通过 WebSocket 协议(protocol)连接的一定数量的用户。该应用程序每 5 秒向每个用户发送个人统计信息。

我使用@SendToUser注释来区分用户并个性化统计信息。

在我看来,用@SendToUser注释的方法只能用作消息处理方法。这意味着为了接收统计信息,用户应该首先将消息发送到 Spring Boot 应用程序,然后调用消息处理方法,然后才将统计信息发送回。

因此,WebSocket 协议(protocol)现在看起来确实非常有用:请求仍然由用户发起(准确地说是由用户的浏览器发起)。唯一的优点是您不应该在每次想要检索新统计信息时都打开新连接。

是否可以完全删除从用户发送到应用程序的消息?例如,每隔5秒检索一次当前连接的用户列表,然后迭代该列表并将消息一一发送给每个用户?或者用户仍然需要发起统计检索?

最佳答案

您可以将 SimpMessagingTemplate 注入(inject)任何 Spring bean 并向用户发送消息。

simpMessagingTemplate.convertAndSendToUser(username, "/destination", message);

参见https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/messaging/simp/SimpMessagingTemplate.html

您可以通过注入(inject) SimpUserRegistry bean 来检索已连接用户的列表。

参见https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/messaging/simp/user/SimpUserRegistry.html

关于java - Spring WebSocket : broadcasting messages to users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310757/

相关文章:

java - 如何从 Spring Rest 文档中排除一些测试?

java - 如何在 Spring 应用程序上下文中扩展已定义的列表和映射?

java - 在 Java 中你应该总是使用枚举而不是常量吗?

java - 反编译能看到Java注释吗?

java - Json转java

java - 在 Spring MVC 3.2.x 中实现级联下拉菜单的正确方法

spring-boot - 对于@SpringBootTest @TestConfiguration 类的@Import 什么都不做,而@ContextConfiguration 按预期覆盖

java - 通过 Spring Boot application.yml 配置 Hazelcast

java - 具有 Spring Security 的外部 SSO

java - RecyclerView (ImageView) 中的 OnClickListener