最终我成功连接到了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());
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());
}
}
我在终端中使用了标头,但 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);
}
问题出在这行代码之后:
Type type = handler.getPayloadType(stompHeaders);
之后没有任何其他操作,我的程序就直接结束了,所以 handleFrame() 没有被执行。
这里有什么问题?可能是 getPayloadType 返回的 Type 类型有问题 - 我选择了 String 类型,因为我认为每个消息都可以表示为字符串。