You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebSocket STOMP消息代理无法广播消息求助

Spring WebSocket STOMP消息代理无法广播消息求助

各位大佬,我已经卡了好几个小时在WebSocket STOMP消息代理的问题上,试了各种办法都找不到解决方案。跟着YouTube上的教程和Spring官方文档一步步操作,但就是没效果。目前我能成功订阅目标地址,也能给服务器发送消息(服务器确实能收到),但不管是尝试把消息发给特定客户端,还是广播给所有连接的客户端,都完全没反应。

客户端代码

WebSocketStompClient stompClient = new WebSocketStompClient(new StandardWebSocketClient());

stompFriendRequestsHandler = new WebsocketHandler();

WebSocketHttpHeaders stompFriendRequestHeader = createWebsocketHeader(headerForFriendRequestStomp);

System.out.println(stompFriendRequestHeader);

stompClient.connect("ws://localhost:8080/ws", stompFriendRequestHeader, stompFriendRequestsHandler);

StompSession session = stompFriendRequestsHandler.getSession();

session.subscribe("/all/messages", new StompFrameHandler() {

    @Override
    public Type getPayloadType(StompHeaders headers) {
        System.out.println("getPayLoadType!");
        return String.class;
    }

    @Override
    public void handleFrame(StompHeaders headers, Object payload) {
        System.out.println("YAY! We got the broadcast");
        System.out.println(payload);
    }
});

ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode();
objectNode.put("friendRequestUsername", 1);

try {
    byte[] payload = objectMapper.writeValueAsBytes(objectNode);
    stompFriendRequestsHandler.getSession().send("/app/application", payload);
} catch (JsonProcessingException e) {
    throw new RuntimeException(e);
}

服务器端消息处理方法

这段代码里的打印语句能正常输出,说明服务器确实收到了客户端的消息,并且映射到了正确的方法:

@MessageMapping("/application")
@SendTo("/all/messages")
public Message send(final Message message)throws Exception{
    System.out.println("BROADCASTER");
    System.out.println(message);
    return message;
}

服务器端配置类

@Configuration
@EnableWebSocketMessageBroker
@ComponentScan(basePackages = {"com/swoosh/springbootchatapp/chatapp/friend/system/stomp/friendrequest/controller"})
public class StompConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry){
        registry.addEndpoint("/ws").setAllowedOrigins("*");
        //.setHandshakeHandler(new StompHandshakeHandler());
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry){
        registry.enableSimpleBroker("/all", "/specific");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

现在的问题是:客户端订阅了/all/messages,而且能触发getPayloadType方法(控制台能打印getPayLoadType!),但handleFrame里的内容完全没输出,客户端根本收不到服务器广播回来的消息。有没有大佬能帮忙看看哪里出问题了?

备注:内容来源于stack exchange,提问作者Ponta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:42:39