websocket - SockJS 增加池大小

标签 websocket stomp 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 的入站 channel :

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.taskExecutor().corePoolSize(4);
        registration.taskExecutor().maxPoolSize(4)
    }
    
    The official documentation建议使用池大小 = 内核数。当然,由于达到了 maxPoolSize,因此请求将通过内部队列进行处理。因此,鉴于此配置,我可以同时处理 4 个请求。

    关于websocket - SockJS 增加池大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68245980/

    相关文章:

    javascript - 对于推送通知,websocket 是强制性的吗?

    go - golang 中的 websocket 服务器打开文件过多错误

    node.js - socket 向同一个客户端 socketio 发出多次

    spring - Spring @SubscribeMapping 是否真的为客户端订阅了某个主题?

    ruby - ActiveMQ 在通过 STOMP 发送时将消息存储在 Base64 中?

    websocket - 为什么 sockJS 将 '/info' 添加到给定的 websocket url 路径

    asp.net - 使用 Microsoft.WebSockets NuGet 包的 asp.net 4.5 示例

    java - 无法通过 Spring Boot 通过 STOMP 连接到 ActiveMQ 代理

    javascript - 使用 sockjs 和 stomp 在/信息请求期间没有 cookie

    angular - 在 Angular5 中使用 SockJS 时出错 - "sockjs_client_1.SockJS is not a constructor"