在Spring-Websockets 4.2中使用SockJS的部分消息

时间:2015-10-27 15:18:34

标签: spring spring-websocket sockjs

我正在使用带有SockJS的Spring-Websockets 4.2。

由于客户端收到的消息可能非常大,我想使用部分消息。我的TextWebSocketHandler的子类确实覆盖supportsPartialMessages以返回true。但是,由于Spring创建的SockJsWebSocketHandler不支持部分消息,因此仍然出现错误code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages

作为一种解决方法,我已经将缓冲区大小增加到1 MB,如here所述,但由于我必须支持相当多的客户端(同时约为2000),这也需要很多记忆。

有没有办法在SockJS上使用部分消息?

1 个答案:

答案 0 :(得分:0)

在我的情况下,我的tomcat服务器可以与TextWebSocketHandler一起使用。
在执行此操作之前,您需要检查一下supportsPartialMessages

首先,如下重写supportsPartialMessages()

//This value set as true in my properties file. Just for test. actually you don't need this.
@Value("#{config['server.supportsPartialMessages']}")
private boolean supportsPartialMessages;

//If you need to handle partial message, should return true.
@Override
public boolean supportsPartialMessages() {
    return supportsPartialMessages;     
}

然后我添加“ messageRoom”属性,以在建立连接时将部分消息存储到每个websocket会话中。

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    super.afterConnectionEstablished(session);

    //I think this is easier to keep each message and each client.
    session.getAttributes().put("messageRoom", new StringBuilder(session.getTextMessageSizeLimit()));
}

当您从客户端收到消息时,请执行此操作。

@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    super.handleTextMessage(session, message);

    StringBuilder sbTemp = (StringBuilder)session.getAttributes().get("messageRoom");

    //isLast() will tell you this is last chunk or not.
    if(message.isLast() == false) {     
        sbTemp.append(Payload);

    }else {
        if(sbTemp.length() != 0) {          
            sbTemp.append(Payload);     

            this.logger.info(session.getRemoteAddress() + ":RECEIVE_TO[CLIENT][PARTIAL][" + sbTemp.length() + "]:" + sbTemp.toString());
            doYourWork(session, sbTemp.toString());
            //Release memory would be nice.
            sbTemp.setLength(0);
            sbTemp.trimToSize();

        }else {         
            this.logger.info(session.getRemoteAddress() + ":RECEIVE_TO[CLIENT][WHOLE]:" + message.getPayload());
            doYourWork(session, Payload);
        }
    }
}

这是几年前完成的,所以我不记得我从哪里得到的。 但是我仍然感谢他们。