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 是因为我认为每条消息都可以显示为字符串。
我有一个类似的问题。
问题是我指定了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()).
| 归档时间: |
|
| 查看次数: |
3809 次 |
| 最近记录: |