使用 websockets 和 SpringBoot 广播消息

Chr*_*ner 2 java websocket spring-boot

我试图了解如何使用带有 Spring Boot 的 websockets 向 Javascript 应用程序发布/广播消息。我能找到的所有示例都在使用StompJs客户端 - 但是我无法StompJs在我的客户端代码中使用,而且我不确定我的后端是否正确,这无济于事。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/subscribe")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }

}
Run Code Online (Sandbox Code Playgroud)

只需使用一个简单@Scheduled的每 5 秒产生一次时间,并将其发送到time主题(好吧,我相信这就是它在做什么......)

@Component
@Slf4j
public class TimeSender {
    private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss");

    private SimpMessagingTemplate broker;

    @Autowired
    public TimeSender(final SimpMessagingTemplate broker) {
        this.broker = broker;
    }

    @Scheduled(fixedRate = 5000)
    public void run() {
        String time = LocalTime.now().format(TIME_FORMAT);

        log.info("Time broadcast: {}", time);

        broker.convertAndSend("/topic/time", "Current time is " + time);
    }
}
Run Code Online (Sandbox Code Playgroud)

在尝试测试时,有几点我有点困惑。使用Simple websocket clientChrome 插件,我必须添加websocket到我的请求末尾才能连接。连接想要ws://localhost:8080/subscribe/websocket没有websocket我无法连接,但我在任何示例或 Spring 文档中都找不到提到的这一点?

第二个问题是如何订阅时间话题?所有StompJs客户都调用类似的东西client.subscribe("time")

我试过ws://localhost:8080/subscribe/topic/time/websocket但没有收到任何时间戳。

我不确定我的后端代码是错误的,我的 URL 错误,或者我只是缺少其他东西。

注意:我@Controller从上面失踪了,因为我在这个阶段只专注于将消息从 Spring 推送到客户端,而不是接收消息,我的理解是控制器只处理传入的消息?

cce*_*ist 8

好吧,我想如果一个人足够痴迷地搜索,答案最终会出现。几乎在找到您的帖子后,我立即在http://www.marcelustrojahn.com/2016/08/spring-boot-websocket-example/找到了我需要的答案。有一个非常好的例子,基本上可以满足您的描述。不同之处在于他们使用 Spring SimpMessagingTemplate 将消息发送到队列。一旦我按照他的模式,这一切就像一个魅力。这是相关的代码片段:

@Autowired
SimpMessagingTemplate template

@Scheduled(fixedDelay = 20000L)
@SendTo("/topic/pingpong")
public void sendPong() {
   template.convertAndSend("/topic/pingpong", "pong (periodic)")
}
Run Code Online (Sandbox Code Playgroud)

该方法是void这样的convertAndSend()方法处理发布到主题,而不是像我在网上看到的几乎所有其他教程所指示的返回语句。这有助于解决我的问题。