首页 > 解决方案 > 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 为假,因此将负载更改为空。

所以任何人都可以帮助我解决这个问题。

非常感谢。

标签: spring-bootwebsocketstomp

解决方案


推荐阅读