StompFrameHandler 没有从消息中获取有效载荷

kri*_*2pl 4 java websocket spring-websocket

最后,我的 websocket 客户端连接到端点,但我无法提取消息有效负载。我可以获得标头,但无法识别有效载荷。

我的 WebSocket 客户端如下所示:

    WebSocketTransport webSocketTransport = new WebSocketTransport(standardWebSocketClient);
    SockJsClient sockJsClient = new SockJsClient(Arrays.asList(webSocketTransport));
    WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);

    stompClient.setMessageConverter(new StringMessageConverter());

    StompSessionHandler sessionHandler = new MyStompSessionHandler();
    ListenableFuture<StompSession> connect = stompClient.connect(URL, sessionHandler);

        StompSession stompSession = connect.get();
        System.out.println("sessionId: " + stompSession.getSessionId());

        String path = "/queue/orders";

        stompSession.subscribe(path, new MySimpleStompFrameHandler());
Run Code Online (Sandbox Code Playgroud)

Stomp 帧处理程序:

    private class MySimpleStompFrameHandler implements StompFrameHandler {

    @Override
    public Type getPayloadType(StompHeaders stompHeaders) {
        System.out.println("Headers " + stompHeaders.toString());
        return String.class;
    }

    @Override
    public void handleFrame(StompHeaders stompHeaders, Object payload) {
        System.out.println("Msg " + payload.toString());
        completableFuture.complete(payload.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

我在终端中写入了标题,但 handleFrame 方法中没有任何内容。任何的想法 ?

编辑:调试后,我发现问题出在 DefaultStompSession 类中,该类使用了我的 frameHandler 实现

    private void invokeHandler(StompFrameHandler handler, Message<byte[]> message, StompHeaders stompHeaders) {
    if (message.getPayload().length == 0) {
        handler.handleFrame(stompHeaders, null);
        return;
    }
    Type type = handler.getPayloadType(stompHeaders);
    Class<?> payloadType = ResolvableType.forType(type).resolve();
    Object object = getMessageConverter().fromMessage(message, payloadType);
    if (object == null) {
        throw new MessageConversionException("No suitable converter, payloadType=" + payloadType +
                ", handlerType=" + handler.getClass());
    }
    handler.handleFrame(stompHeaders, object);
}
Run Code Online (Sandbox Code Playgroud)

问题是在这一行Type type = handler.getPayloadType(stompHeaders);之后,没有更多的东西被执行,我的程序刚刚结束,所以 handleFrame() 甚至没有被执行。有什么问题吗?也许从 getPayloadType 返回 Type - 我选择 String 是因为我认为每条消息都可以显示为字符串。

use*_*039 6

我有一个类似的问题。

问题是我指定了stompClient.setMessageConverter(new StringMessageConverter());,而 JSON 作为有效负载传递。

解决方案(针对我的问题): stompClient.setMessageConverter(new MappingJackson2MessageConverter());

您可以做些什么来找到解决方案:

  • 触发异常时抛出(或记录)。对于您的情况,您应该在以下方法中添加覆盖MyStompSessionHandler

     @Override
     public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
         throw new RuntimeException("Failure in WebSocket handling", exception);
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在调试时invokeHandler,检查有效负载的内容。如果您能够执行代码,则可以通过执行new String((byte[]) message.getPayload()).