spring-boot - springboot中的Java stomp websocket客户端
问题描述
我正在尝试在 springboot 环境中构建一个 Java stomp 客户端。但未能从服务器接收消息。代码如下。
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxTextMessageBufferSize(1024 * 1024 * 64);
WebSocketStompClient stompClient = new WebSocketStompClient(new StandardWebSocketClient(container));
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
stompClient.setDefaultHeartbeat(new long[]{20000, 0});
stompClient.setInboundMessageSizeLimit(Integer.MAX_VALUE);
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.afterPropertiesSet();
stompClient.setTaskScheduler(taskScheduler);
StompSessionHandler sessionHandler = new CustmStompSessionHandler();
WebSocketHttpHeaders httpHeaders = new WebSocketHttpHeaders();
stompClient.connect("ws://url:port/all", httpHeaders, stompHeaders, sessionHandler);
public class CustmStompSessionHandler extends StompSessionHandlerAdapter {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
logger.warn("<<<<<<<<<<<<<< afterConnected {}", session.getSessionId());
// session.subscribe("", this);
logger.warn(">>>>>>>>>>>>>> afterConnected {}", session.getSessionId());
}
@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
logger.warn(">>>>>>>>>>>>>> handleException");
}
@Override
public void handleTransportError(StompSession session, Throwable exception) {
logger.error("handleTransportError", exception);
logger.warn(">>>>>>>>>>>>>> handleTransportError");
}
@Override
public Type getPayloadType(StompHeaders headers) {
logger.warn(">>>>>>>>>>>>>> getPayloadType");
return String.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
logger.warn(payload.getClass().getName());
logger.warn("Received : " + JSONObject.toJSONString(payload));
}
日志
DEBUG org.springframework.messaging.simp.stomp.DefaultStompSession - Connection established in session id=c303cb52-80a7-8d43-af90-c65ad08ed4bf
Sending CONNECT {heart-beat=[10000,10000], accept-version=[1.1,1.2]} session=c303cb52-80a7-8d43-af90-c65ad08ed4bf
TRACE org.springframework.messaging.simp.stomp.StompEncoder - Encoding STOMP CONNECT, heart-beat=[10000,10000], accept-version=[1.1,1.2]}
09:39:57.078 TRACE org.springframework.web.socket.adapter.NativeWebSocketSession - Sending TextMessage payload=[CONNECT ve..], byteCount=94, last=true], StandardWebSocketSession[id=994b748c-d564-2b11-54b4-aa88a075d613, uri=null]
DEBUG org.apache.tomcat.websocket.WsFrameClient - WebSocket frame received. fin [true], rsv [0], OpCode [1], payload length [52]
TRACE org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator - Handling TextMessage payload=[{"syncId":..], byteCount=52, last=true] in StandardWebSocketSession[id=994b748c-d564-2b11-54b4-aa88a075d613, uri=null]
DEBUG org.apache.tomcat.websocket.WsFrameClient - WebSocket frame received. fin [true], rsv [0], OpCode [1], payload length [33]
09:39:57.133 TRACE org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator - Handling TextMessage payload=[{"code":40..], byteCount=33, last=true] in StandardWebSocketSession[id=994b748c-d564-2b11-54b4-aa88a075d613, uri=null]
09:39:57.133 TRACE org.springframework.messaging.simp.stomp.StompDecoder - Incomplete frame, resetting input buffer...
09:39:57.133 TRACE org.springframework.web.socket.messaging.WebSocketStompClient - Incomplete STOMP frame content received, bufferSize=85, bufferSizeLimit=2147483647.
然后我看到代码StompDecoder.java
并找到了这个
if (byteBuffer.remaining() > 0) {
StompCommand stompCommand = StompCommand.valueOf(command);
headerAccessor = StompHeaderAccessor.create(stompCommand);
initHeaders(headerAccessor);
readHeaders(byteBuffer, headerAccessor);
payload = readPayload(byteBuffer, headerAccessor);
}
byteBuffer.remaining() > 0 为假,因此将负载更改为空。
所以任何人都可以帮助我解决这个问题。
非常感谢。
解决方案
推荐阅读
- laravel - 如何增加laravel背包中summnote字段的文本区域大小
- javascript - 如何将服务器端口提供给客户端
- css - Flex wrap - 堆叠行而不拉伸?
- java - 如何修复 SpringBoot 应用程序中 SimpleJdbcInsert 中的错误
- powershell - 我正在尝试禁用 office365 E1 许可证的子许可证
- c - 如何在 C 中使用 fork 写入和读取文件
- html - 悬停时隐藏外部节点元素
- r - R Shiny 和使用端口 3838:一个安全漏洞?
- opengl - 镜面高光随着相机的移动而移动
- reactjs - 如何为生成的项目添加骨架负载