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

如何增加SpringSockJSWebSocket服务器实现的输出缓冲区,spring,websocket,sockjs,spring-websocket,Spring,Websocket,Sockjs,Spring Websocket,我使用了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 deco

我使用了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库)

然后我的URL映射看起来

@Override 
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(coBrowseSockJsCustomerHandler(), "/sockjs/cobrowse/customer/").withSockJS();}
我需要在某个地方用sockjs设置这个bean吗?sockjs是如何知道它必须使用这个facory的?

您可以选择并增加缓冲区大小

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

< P>通过使用来自ServelServer容器容器的线索来解决它,并设置属性,这工作

@Bean
public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
    ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
    container.setMaxTextMessageBufferSize(32768);
    container.setMaxBinaryMessageBufferSize(32768);
    logger.info("Websocket factory returned");
    return container;
}

对于客户端:

@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;
}

我用它来配置引擎——在我的例子中,SpringSockJS使用tomcat引擎,但它不起作用。Brian,你能帮我设置容器属性吗?就我而言,它是雄猫。我研究了如何增加缓冲区大小,并根据建议尝试设置servlet上下文初始化参数。。但它不起作用!是否有任何拦截器配置可用于实现此目的?如果我将文件从客户端传递到服务器,则此选项有效;如果我将文件从服务器传递到客户端,则此选项无效。您指定的数字以位为单位,字节或kb??如果我将文件从客户端传递到服务器,则此选项有效,但如果我将文件从服务器传递到客户端,则此选项无效更高的数字对我有效。我和9999999一起去的。谁能告诉我用大数字有什么缺点吗?@KaranGujral,它会占用你的记忆。如果我不用Spring呢?@Albert Hendriks,我不知道。标记为spring的问题related@AlbertHendriksWebSocketContainer=ContainerProvider.getWebSocketContainer();container.setDefaultMaxBinaryMessageBufferSize(1024*1024);不是特定于Spring的,因此非Spring应用程序也是如此。我花了好几天的时间才发现客户端代码中的错误,希望它能为其他人节省一天的时间:您可以在Spring文档中找到几乎相同的代码片段,除了关于Websocket容器的三行代码,所以我复制了这三行,并将它们插入到spring的代码片段之前。但是我错过了下一行,它有一个重要的更改,并使用
newstandardwebsocketclient(container)
中的容器作为参数。因此,容器将在StandardWebsocketClient的空构造函数中使用消息大小的默认值再次初始化。
@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;
}