gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:03:56 28 4
gpt4 key购买 nike

我正在使用带有 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 中使用部分消息?

最佳答案

就我而言,我的 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 session 。
@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);
}
}
}

这是几年前做的,所以我不记得我从哪里得到的。
但我还是很感激他们。

关于spring - Spring-Websockets 4.2 中使用 SockJS 的部分消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33371797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com