如何解决SockJS 增加池大小
我正在使用 SocketJS 和 Stomp 通过后端 api 发送文件以进行处理。 我的问题是如果同时上传两个以上,上传功能就会卡住。
例如:
- 用户 1 -> 上传文件 -> 后端正确接收文件
- 用户 2 -> 上传文件 -> 后端正确接收文件
- 用户 3 -> 上传文件 -> 直到其中之一才会调用后端 上次上传尚未完成。
(一分钟后用户 1 完成上传,第三次上传开始)
我通过日志看到的错误如下:
2021-06-28 09:43:34,884 INFO [MessageBroker-1] org.springframework.web.socket.config.WebSocketMessageBrokerStats.lambda$initLoggingTask$0: WebSocketSession[11 current WS(5)-HttpStream(6)-HttpPoll(0),372 total,26 closed abnormally (26 connect failure,0 send limit,16 transport error)],stompSubProtocol[processed CONNECT(302)-CONNECTED(221)-DISCONNECT(0)],stompBrokerRelay[null],**inboundChannel[pool size = 2,active threads = 2**,queued tasks = 263,completed tasks = 4481],outboundChannel[pool size = 0,active threads = 0,queued tasks = 0,completed tasks = 607],sockJsScheduler[pool size = 1,active threads = 1,queued tasks = 14,completed tasks = 581444]
显然池大小已满:
inboundChannel[池大小 = 2,活动线程 = 2
但我真的找不到增加尺寸的方法。
这是代码:
客户端
ws = new SockJS(host + "/createTender");
stompClient = Stomp.over(ws);
服务端配置
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer {
...
...
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setMessageSizeLimit(100240 * 10240);
registration.setSendBufferSizeLimit(100240 * 10240);
registration.setSendTimeLimit(20000);
}
我已经尝试过更改 configureWebSocketTransport 参数,但没有奏效。 如何增加套接字的池大小?
解决方法
可以使用此方法覆盖进入 WebSocket 的入站通道:
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(4);
registration.taskExecutor().maxPoolSize(4)
}
The official documentation 建议使用池大小 = 内核数。当然,由于达到了 maxPoolSize,因此请求将通过内部队列进行处理。因此,鉴于此配置,我可以同时处理 4 个请求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。