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 推送到客户端,而不是接收消息,我的理解是控制器只处理传入的消息?
好吧,我想如果一个人足够痴迷地搜索,答案最终会出现。几乎在找到您的帖子后,我立即在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()方法处理发布到主题,而不是像我在网上看到的几乎所有其他教程所指示的返回语句。这有助于解决我的问题。
| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |