WebSocket ConvertAndSendUser无法向指定用户发送消息求助
直播竞拍WebSocket通知收不到问题排查与解决
以下是针对你遇到的问题的排查方向和解决方案:
1. 消息代理配置冲突
你的configureMessageBroker中启用了/user作为SimpleBroker的监听前缀,但Spring WebSocket的用户目标(User Destination)是由UserDestinationMessageHandler专门处理的,不需要SimpleBroker直接监听/user前缀。这会导致消息路由逻辑冲突,无法正确将私人消息推送到对应用户。
修改配置:
@Override public void configureMessageBroker(MessageBrokerRegistry config) { // 移除/user前缀,只保留topic和queue config.enableSimpleBroker("/topic","/queue"); config.setApplicationDestinationPrefixes("/app"); config.setUserDestinationPrefix("/user"); }
2. 确认Principal与winnerId的一致性
虽然浏览器WS显示user-name为3,但需要确保:
CustomHandshakeHandler的determineUser方法返回的Principal的getName()结果是字符串"3"(和String.valueOf(winnerId)完全匹配)- 排查
userClientService.getUserIdFromToken是否确实返回了正确的userId,可添加日志打印验证:String userId = userClientService.getUserIdFromToken(jwtToken); System.out.println("Authenticated user ID: " + userId); // 确认输出是"3" return () -> userId;
3. 检查消息发送模板类型
确保你使用的messagingTemplate是Spring WebSocket专用的SimpMessagingTemplate,而非普通的MessagingTemplate。普通模板无法正确处理WebSocket的用户目标路由逻辑。
4. 前端订阅时机验证
确认前端是在Stomp连接成功后才执行订阅操作,避免因连接未就绪导致订阅无效:
stompClient.connect({}, (frame) => { console.log('Connected: ' + frame); // 连接成功后再执行订阅 stompClient.subscribe('/user/queue/notifications', (message) => { console.log("inside") const notification = JSON.parse(message.body); console.log("notification",notification) if (notification.type === "AUCTION_WON") { alert(notification.message); } }); }, (error) => { console.error('Connection error:', error); });
5. 消息序列化排查
确认BidMessage类支持JSON序列化,比如添加Jackson注解(若使用默认序列化机制):
import com.fasterxml.jackson.annotation.JsonProperty; public class BidMessage { @JsonProperty("type") private String type; @JsonProperty("message") private String message; @JsonProperty("productId") private Long productId; // 构造方法、getter/setter }
序列化异常可能导致消息在后端发送环节被丢弃,可通过后端日志排查是否有相关报错。
内容的提问来源于stack exchange,提问作者Yoey
相关产品推荐
相关产品推荐

