2014-02-12 37 views
7

不能發送超過8KB的消息,下面是錯誤如何增加輸出緩衝器,因爲我已經使用sockjs的WebSocket服務器的春天落實和春季sockjs的WebSocket服務器實現

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] 

任何想法我怎麼能增加緩衝大小


我用下列工廠作爲彈簧sockjs利用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();} 

我是否需要設置這個bean與sockjs地方? sockjs如何知道它必須使用這個技術?

回答

7

使用線索從ServletServerContainerFactoryBean的http://docs.spring.io/spring/docs/4.0.1.RELEASE/javadoc-api/index.html?org/springframework/web/socket/sockjs/SockJsService.html -got保持解決了它,並設置屬性,這個工作

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

您指定的數字位,字節或kb? – BiJ

+0

這工作,如果我傳遞文件從客戶端到服務器,但不,如果我senf文件從服務器到客戶端 – gstackoverflow

1

你可以configure the websocket engine並增加緩衝區大小。

注意,根據您想要使用的實際大小,請記住這些消息將完全緩衝在內存中! 如果客戶端支持,您可能需要考慮使用partial messages

+0

我用它來配置引擎 - 在我的情況下,spring sockjs使用的是tomcat引擎,但它不起作用 – cpandey05

+0

Brian,你能幫我一下如何設置容器屬性嗎?在我的情況下,它是tomcat。我看看http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html如何增加緩衝區大小,並建議嘗試設置servlet上下文初始化參數..但它沒有不行!是否有任何攔截器或配置可用於實現此目的? – cpandey05

+0

這工作,如果我通過文件從客戶端到服務器,但不,如果我senf文件從服務器到客戶端 – gstackoverflow

2

爲客戶端:

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