我试图了解如何使用带有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推送到客户端,而不是接收消息和它我的理解控制器只处理传入?
答案 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()
方法处理发布到主题,而不是返回语句,就像我在网上看到的每个其他教程所指示的那样。这有助于解决我的问题。