gpt4 book ai didi

java - StompFrameHandler 没有从消息中获取有效负载

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:15 24 4
gpt4 key购买 nike

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

我的 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());

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());
}
}

我在终端中写入了 header ,但 handleFrame 方法中没有任何内容。有什么想法吗?

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

    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);
}

问题出在这一行 Type type = handler.getPayloadType(stompHeaders); 之后,没有执行任何操作,我的程序就结束了,所以 handleFrame() 甚至都没有执行。那里出了什么问题?也许使用从 getPayloadType 返回的类型 - 我选择字符串,因为我认为每条消息都可以显示为字符串。

最佳答案

我遇到了类似的问题。

问题是我指定了 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);
    }
  • 调试 invokeHandler 时,检查负载的内容。如果您能够执行代码,则可以通过执行 new String((byte[]) message.getPayload()) 来实现。

关于java - StompFrameHandler 没有从消息中获取有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com