使用websockets和SpringBoot

时间:2017-10-21 19:39:23

标签: java spring-boot websocket

我试图了解如何使用带有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");
    }

}

只需使用简单的@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);
    }
}

在尝试测试时,我有点困惑。使用Chrome的Simple websocket client插件,我必须在请求结束时添加websocket才能进行连接。一个连接希望ws://localhost:8080/subscribe/websocket没有websocket我无法连接,但我无法在任何示例或Spring文档中找到这个提示?

第二个问题是我如何订阅时间主题?所有StompJs个客户都会调用client.subscribe("time")等内容。

我已经尝试了ws://localhost:8080/subscribe/topic/time/websocket,但在收到任何时间戳方面都没有运气。

我不确定我的后端代码是错误的,我的网址是错误的,还是我错过了其他内容。

注意:我的@Controller在上面缺失,因为我只关注在此阶段将消息从Spring推送到客户端,而不是接收消息和它我的理解控制器只处理传入?

1 个答案:

答案 0 :(得分:2)

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

@Autowired
SimpMessagingTemplate template

@Scheduled(fixedDelay = 20000L)
@SendTo("/topic/pingpong")
def sendPong() {
   template.convertAndSend("/topic/pingpong", "pong (periodic)")
}

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