通过SockJS连接Stomp并订阅消息后,仅接收标头

时间:2019-07-25 15:01:56

标签: java node.js websocket stomp sockjs

我正在编写一个客户端来测试WebSocket连接并接收数据。

在Stomp上建立Websocket之后,我只收到标头 订阅后,我没有收到邮件内容/正文它根本没有调用handleFrame())

我看到了MessageConversionExceptions。请查看以下片段。我已经强调并评论了一些重要内容。

摘要(Web套接字客户端):

public class StompService {
    public static final String WS_URL_SUFFIX = "/monitoring-channel";

    public StompSession createStompWSConnection(String socketURL) throws Exception  {
        List<Transport> transports = new ArrayList<Transport>();
        transports.add(new WebSocketTransport(new StandardWebSocketClient()));

        SockJsClient sockJsClient = new SockJsClient(transports);
        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
        stompClient.setMessageConverter(new StringMessageConverter());

        //socketURL is "http://localhost:8090/monitoring-channel".. This works in the Node client
        StompSession session = stompClient.connect(socketURL, new SessionHandler()).get();
        System.out.println("Session : " + session);
        return session;
    }

    public boolean subscribeStreamData(StompSession wsSession, String watchId, String type, StompFrameHandler handler) {
        type = type.toUpperCase()
        String topic = "/topic/" + type + "/" + watchId;        
        wsSession.subscribe(topic, handler);
        return true;
    }
}

public class DefaultStompFrameHandler implements StompFrameHandler {
    private static final Logger log = LogManager.getLogger();
    BlockingQueue<String> blockingQueue;

    @Override
    public Type getPayloadType(StompHeaders stompHeaders) {
        log.debug("getPayloadType() :: stompHeaders = " + stompHeaders);  //This is printing
        return String.class;
    }

    @Override
    public void handleFrame(StompHeaders stompHeaders, Object o) {
        //THIS BLOCK IS NOT GETTING INVOKED AT ALL
        System.out.println("Object Recieved : " + new String((byte[]) o));
        blockingQueue.offer(new String((byte[]) o));
    }
}

public void main(String... args) throws Exception {
        //...

        StompSession session = stompService.createStompWSConnection("http://localhost:8090" + StompService.WS_URL_SUFFIX);
        System.out.println("Session = " + session.getSessionId());
        String watchId = "123";
        System.out.println("Watch Id : " + watchId);
        stompService.subscribeStreamData(session, watchId, "WAVEFORMS", new DefaultStompFrameHandler());
    }

公共类SessionHandler实现StompSessionHandler {     @Override     public void afterConnected(StompSession stompSession,StompHeaders stompHeaders){         System.out.println(“已连接!”); //收到邀请     }

@Override
public Type getPayloadType(StompHeaders headers) {
    return String.class;
}

@Override
public void handleFrame(StompHeaders headers, Object payload) {
    System.out.println("~~~~~");    
}

@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload,
        Throwable exception) {
    System.out.println("~~~~~~~~~~~~~~~");
    //GETTING EXCEPTION : org.springframework.messaging.converter.MessageConversionException: No suitable converter for payload type [class [B] from handler type [class com.test.kymaloadtest.service.DefaultStompFrameHandler]

    //No suitable converter for payload type [class [B] from handler type [class com.test.kymaloadtest.service.DefaultStompFrameHandler]
}

@Override
public void handleTransportError(StompSession session, Throwable exception){
    System.out.println("~~~~~~~~~~~~~~~");      
}

}


但是模拟相同的客户端可以在NodeJS中使用。 我已尽力而为,但无法弄清为什么我只得到标题而不是消息内容/数据。


这是我在控制台中看到的:

[DEBUG] 2019-07-25 20:09:19.144 [WebSocketClient-AsyncIO-1] DefaultStompFrameHandler - getPayloadType() :: stompHeaders = {destination=[/topic/WAVEFORMS/d7e0b709-0150-4b93-b9d3-0c279c69c929], content-type=[application/json;charset=UTF-8], subscription=[0], message-id=[c60b1afba030419887768d39353f2b45-27320], content-length=[1794]}
[DEBUG] 2019-07-25 20:09:19.393 [WebSocketClient-AsyncIO-1] DefaultStompFrameHandler - getPayloadType() :: stompHeaders = {destination=[/topic/WAVEFORMS/d7e0b709-0150-4b93-b9d3-0c279c69c929], content-type=[application/json;charset=UTF-8], subscription=[0], message-id=[c60b1afba030419887768d39353f2b45-27321], content-length=[1748]}
[DEBUG] 2019-07-25 20:09:19.645 [WebSocketClient-AsyncIO-1] DefaultStompFrameHandler - getPayloadType() :: stompHeaders = {destination=[/topic/WAVEFORMS/d7e0b709-0150-4b93-b9d3-0c279c69c929], content-type=[application/json;charset=UTF-8], subscription=[0], message-id=[c60b1afba030419887768d39353f2b45-27322], content-length=[1723]}

谢谢。

1 个答案:

答案 0 :(得分:0)

通过进行以下编辑可以解决此问题:

[1] - By using SimpleMessageConverter : stompClient.setMessageConverter(new SimpleMessageConverter());
[2] - Changing the return type in SessionHandler : return byte[].class;

public StompSession createStompWSConnection(String socketURL, StompSessionHandler sessionHandler) throws Exception  {
        List<Transport> transports = new ArrayList<Transport>();
        transports.add(new WebSocketTransport(new StandardWebSocketClient()));
//      transports.add(new RestTemplateXhrTransport());

        SockJsClient sockJsClient = new SockJsClient(transports);
        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
        stompClient.setMessageConverter(new SimpleMessageConverter());

        StompSession session = stompClient.connect(socketURL,sessionHandler).get();
        System.out.println("Session : " + session);
        return session;
    }

@Override
    public Type getPayloadType(StompHeaders headers) {
//      log.info("getPayloadType() :: stompHeaders = " + headers);
        return byte[].class;
    }