2014-02-12 10 views
7

I Frühjahr Implementierung Server von sockjs websocket verwendet haben, zu erhöhen und nicht in der Lage Nachricht über 8 KB zu übertragen, nachdem der FehlerWie Ausgabepuffer für Feder sockjs websocket Server-Implementierung

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] 

Jede Idee, wie kann ich den Puffer erhöhen

Größe

Früher habe ich folgende Werk als Feder sockjs nutzt tomcat Behälter (App in tomcat eingesetzt wird und ich auch bestätigen debuggt, dass es in der Tat tomcat lib verwendet)

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

Und dann meine URL-Mapping sieht

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

Muss ich mit sockjs irgendwo diese Bohne setzen müssen? wie weiß sockjs, dass es dieses facory verwenden muss?

Antwort

7

es wurde gelöst durch Ahnung von http://docs.spring.io/spring/docs/4.0.1.RELEASE/javadoc-api/index.html?org/springframework/web/socket/sockjs/SockJsService.html -Haben halten ServletServerContainerFactoryBean verwenden und die Eigenschaften festgelegt, diese

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

Die Nummer, die Sie angeben, sind in Bit, Byte oder KB ?? – BiJ

+0

Das funktioniert, wenn ich die Datei vom Client an den Server übergebe, aber nicht, wenn ich die Datei vom Server zum Client senf – gstackoverflow

1

Sie können configure the websocket engine und erhöhen Sie die Puffergröße.

Achten Sie darauf, dass diese Nachrichten, abhängig von der tatsächlichen Größe, die Sie verwenden möchten, vollständig im Speicher zwischengespeichert werden! Sie können die Verwendung von partial messages in Erwägung ziehen, wenn Ihr Client dies unterstützt.

+0

Ich habe das verwendet, um die Engine zu konfigurieren -In meinem Fall Spring sockjs verwendet Tomcat-Engine, aber es hat nicht funktioniert – cpandey05

+0

Brian, Können Sie mir helfen, wie die Container-Eigenschaften zu setzen? In meinem Fall ist es Kater. Ich habe mir http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html angeschaut, wie man die Puffergröße erhöht und wie vorgeschlagen versucht, den Servlet-Kontextinitialisierungsparameter zu setzen. Aber das tat es nicht arbeiten! Gibt es einen Interceptor oder eine Konfiguration, die dazu verwendet werden können? – cpandey05

+0

Dies funktioniert, wenn ich Datei vom Client an den Server übergeben, aber nicht, wenn ich Senf-Datei vom Server zum Client – gstackoverflow

2

für Client-Seite:

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

für Server-Seite:

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