refactor: 完善websocket配置和测试用例

This commit is contained in:
haoxr
2023-08-31 18:29:12 +08:00
parent edebf13a5d
commit 9d272406c5
2 changed files with 34 additions and 14 deletions

View File

@@ -9,24 +9,46 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo
/**
* WebSocket 配置类
* <p>
* STOMP 不是一个传输协议,而是一个简单的文本消息协议,定义消息格式和交换规则
*
* @author haoxr
* @since 2.3.0
*/
@Configuration
@ConditionalOnProperty(name = "system.config.websocket-enabled")// system.config.websocket-enabled = true 才会自动装配
@EnableWebSocketMessageBroker // 注解告诉Spring框架要开启WebSocket消息代理功能,并配置相关的端点和消息代理
@EnableWebSocketMessageBroker // 启WebSocket消息代理功能和配置STOMP协议实现实时双向通信和消息传递
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/user");
}
/**
* 配置和注册WebSocket端点(endpoints)
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 注册了一个 /ws 的端点用于建立WebSocket连接。
registry.addEndpoint("/ws").setAllowedOriginPatterns("*");
registry
.addEndpoint("/ws") // 注册了一个 /ws 的端点
.setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接
.withSockJS() // 启用 SockJS (浏览器不支持WebSocketSockJS 将会提供兼容性支持)
;
}
/**
* 配置消息代理(Message Broker)
* <p>
* 设置消息传输的规则和前缀
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 客户端发送消息的请求前缀
registry.setApplicationDestinationPrefixes("/app");
// 客户端订阅消息的请求前缀topic一般用于广播推送queue用于点对点推送
registry.enableSimpleBroker("/topic", "/queue");
// 服务端通知客户端的前缀可以不设置默认为user
registry.setUserDestinationPrefix("/user");
}
}

View File

@@ -1,6 +1,5 @@
package com.youlai.system.controller;
import cn.hutool.json.JSONUtil;
import com.youlai.system.common.result.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -48,13 +47,12 @@ public class WebsocketController {
/**
* 点对点发送消息
*
* @param userId 用户ID
* @param username 用户
*/
@PostMapping("/sendToUser/{userId}")
public Result sendToUser(@PathVariable Long userId, String message) {
log.info("【点对点请求接收】用户:{};消息:{}", userId, JSONUtil.toJsonStr(message));
@PostMapping("/sendToUser/{username}")
public Result sendToUser(@PathVariable String username) {
// 发送主题目的(destination)= /user/{userId}/message
messagingTemplate.convertAndSendToUser(String.valueOf(userId), "/message", message);
messagingTemplate.convertAndSendToUser(username, "/queue/user", "hello "+username);
return Result.success("点对点消息发送成功");
}