spring - 如何使用 STOMP 从 Spring WebSocket 服务器向 WebSocket 客户端发送消息?
问题描述
我有两个使用 STOMP 的 Spring Boot WebSocket 应用程序:
- WebSocket 服务器
- WebSocket 客户端
我能够从客户端发送 WebSocket 消息并从服务器响应它。但是,现在我想向由服务器端事件触发的客户端发送 WebSocket 消息。
有人可以告诉我这样做的方法吗?
这是我现在在服务器端的内容:
WebSocketConfig.java:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic/");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/alarm");
}
}
WebSocketController.java:
@Controller
public class WebSocketController {
@MessageMapping("/alarm")
@SendTo("/topic/message")
public void processMessageFromClient(@Payload String message, Principal principal) throws Exception {
System.out.println("WEBSOCKET MESSAGE RECEIVED" + message);
}
@RequestMapping(value = "/start/{alarmName}", method = RequestMethod.POST)
public String start(@PathVariable String alarmName) throws Exception {
System.out.println("Starting " + alarmName);
/* SEND MESSAGE TO WEBSOCKET CLIENT HERE */
return "redirect:/";
}
}
解决方案
我在官方春季文档中找到了答案。
你只需要注入一个SimpMessagingTemplate
.
我的控制器现在看起来像这样:
@Controller
public class WebSocketController {
private SimpMessagingTemplate template;
@Autowired
public WebSocketController(SimpMessagingTemplate template) {
this.template = template;
}
@MessageMapping("/alarm")
@SendTo("/topic/message")
public void processMessageFromClient(@Payload String message, Principal principal) throws Exception {
System.out.println("WEBSOCKET MESSAGE RECEIVED" + message);
}
@RequestMapping(value = "/start/{alarmName}", method = RequestMethod.POST)
public String start(@PathVariable String alarmName) throws Exception {
System.out.println("Starting " + alarmName);
this.template.convertAndSend("/topic/message", alarmName);
return "redirect:/";
}
}
推荐阅读
- visual-studio - 如何在后台运行 MATLAB
- java - 使用 Volley 的 Android 注册屏幕
- sql - 在Oracle中编写查询,根据结果数据获取所有满足条件的行
- ios - 如何在应用程序从 IOS Swift 应用程序的后台变为活动状态时呈现特定的视图控制器
- android - 从url下载pdf,在flutter中保存到android中的手机本地存储
- python - 如何使用正则表达式查找匹配的单词?
- php - Laravel 访问模型在关系方法中的属性
- html - Angular 9-在显示动态json响应时添加行号
- c# - 如何将代码移动到数据中,成为更多的数据驱动方法?
- animation - 动画不适用于 GeometryReader 和 NavigationView 的组合