代码之家  ›  专栏  ›  技术社区  ›  cpandey05

如何增加springsockjswebsocket服务器实现的输出缓冲区

  •  13
  • cpandey05  · 技术社区  · 11 年前

    我使用了sockjs websocket服务器的spring实现,无法传输超过8KB的消息,以下是错误

    2014-02-12 19:36:29,990 - org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession - DEBUG - SockJS session id=35n41xel was closed, CloseStatus [code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages]
    

    我知道如何增加缓冲区大小吗


    当springsockjs利用tomcat容器时,我使用了以下工厂(应用程序部署在tomcat中,我还进行了调试以确认它确实使用了tomcat lib)

    @Bean
    public WebSocketContainerFactoryBean createWebSocketContainer() {
        WebSocketContainerFactoryBean container = new WebSocketContainerFactoryBean();
        container.setMaxTextMessageBufferSize(16384);
        container.setMaxBinaryMessageBufferSize(8192);
        return container;
    }
    

    然后我的URL映射看起来

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(coBrowseSockJsCustomerHandler(), "/sockjs/cobrowse/customer/").withSockJS();}
    

    我需要在某个地方用sockjs设置这个bean吗?sockjs如何知道它必须使用这个facory?

    5 回复  |  直到 10 年前
        1
  •  17
  •   cpandey05    11 年前

    通过使用来自 http://docs.spring.io/spring/docs/4.0.1.RELEASE/javadoc-api/index.html?org/springframework/web/socket/sockjs/SockJsService.html -获得ServletServerContainerFactoryBean并设置了财产,这很有效

    @Bean
    public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(32768);
        container.setMaxBinaryMessageBufferSize(32768);
        logger.info("Websocket factory returned");
        return container;
    }
    
        2
  •  13
  •   gstackoverflow    7 年前

    对于客户端:

    @Bean
    public static WebSocketStompClient getClient() {
        List<Transport> transports = new ArrayList<>();
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.setDefaultMaxBinaryMessageBufferSize(1024 * 1024);
        container.setDefaultMaxTextMessageBufferSize(1024 * 1024);
        transports.add(new WebSocketTransport(new StandardWebSocketClient(container)));
        WebSocketClient webSocketClient = new SockJsClient(transports);
        WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
        stompClient.setInboundMessageSizeLimit(Integer.MAX_VALUE);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());
        return stompClient;
    }
    

    对于服务器端:

    @Bean
    public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(32768);
        container.setMaxBinaryMessageBufferSize(32768);
        logger.info("Websocket factory returned");
        return container;
    }
    
        3
  •  1
  •   Brian Clozel    11 年前

    你可以 configure the websocket engine 并增加缓冲区大小。

    注意,根据您想要使用的实际大小,请记住这些消息将完全缓冲在内存中! 您可能需要考虑使用 partial messages 如果您的客户支持。

        4
  •  1
  •   Piacenti    2 年前

    在启动spring应用程序之前,您可以设置属性

    System.setProperty("org.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE", (1024*1024).toString()).
    

    我尝试过多个bean配置,但这些配置都不起作用,但当我查看代码时,这个属性似乎在多个地方被读取。我确信有一些bean配置是有效的,但如果您不想在一个有效之前尝试许多不同的配置,您可以只设置这个参数。

        5
  •  0
  •   akenney    3 年前

    在web.xml文件中设置此项对我很有用:

    <context-param>
      <param-name>org.apache.tomcat.websocket.textBufferSize</param-name>
      <param-value>65536</param-value>
    </context-param>
    <context-param>
      <param-name>org.apache.tomcat.websocket.binaryBufferSize</param-name>
      <param-value>65536</param-value>
    </context-param>