2014-10-24 4 views
5

На стороне клиента я использую Stomp для подключения WebSocket и на стороне сервера я использую Spring 4 Он на стороне клиента я сделал конфигурации, какStomp над WebSocket: Размер буфера отправки превышает допустимый предел

var socket = new SockJS(urlBase + "/" + contextroot+'/hello'); 
stompClient = Stomp.over(socket); 

Ниже кода выполняется на каждые 2 секунды, чтобы отправить данные на сервер

stompClient.send('/app/sendRequest/'+indexVal, {}, 
JSON.stringify({index : simIndex})); 

ответ сервера ниже очереди

stompClient.subscribe('/queue/response', processResponseObj); 

в конфигурации на стороне сервера сделано как

<websocket:message-broker application-destination-prefix="/app"> 
    <!--<websocket:transport send-timeout="15000" message-size="1051648" send-buffer-size="1051648"/> --> 
    <websocket:stomp-endpoint path="/hello"> 
     <websocket:sockjs /> 
    </websocket:stomp-endpoint> 
    <websocket:stomp-broker-relay prefix="/topic, /queue" /> 

    <websocket:message-converters> 
     <beans:bean class="org.springframework.messaging.converter.MappingJackson2MessageConverter"> 
     <beans:property name="objectMapper" ref="objectMapper" /> 
     </beans:bean> 
    </websocket:message-converters> 

    </websocket:message-broker> 

Сообщение responsded, как на стороне сервера

messagingTemplate.convertAndSend("/queue/response",obj); 

После некоторого второго я получаю сообщение об ошибке

2014-10-24 16:39:33,869 ERROR et.messaging.SubProtocolWebSocketHandler: 330 - Terminating session id 'dkbzrkxp' 
org.springframework.web.socket.handler.SessionLimitExceededException: The send buffer size 1147188 bytes for session 'dkbzrkxp exceeded the allowed limit 1051648 
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.sessionLimitReached(ConcurrentWebSocketSessionDecorator.java:162) ~[ConcurrentWebSocketSessionDecorator.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.checkSessionLimits(ConcurrentWebSocketSessionDecorator.java:150) ~[ConcurrentWebSocketSessionDecorator.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.sendMessage(ConcurrentWebSocketSessionDecorator.java:105) ~[ConcurrentWebSocketSessionDecorator.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageToClient(StompSubProtocolHandler.java:276) ~[StompSubProtocolHandler.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.handleMessage(SubProtocolWebSocketHandler.java:326) ~[SubProtocolWebSocketHandler.class:4.0.6.RELEASE] 
    at org.springframework.messaging.support.ExecutorSubscribableChannel$1.run(ExecutorSubscribableChannel.java:70) [ExecutorSubscribableChannel$1.class:4.0.6.RELEASE] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_20] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_20] 
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_20] 
2014-10-24 16:39:33,871 WARN ort.session.WebSocketServerSockJsSession: 285 - Failed to send SockJS close frame: The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid state for called method 
2014-10-24 16:39:33,875 ERROR et.messaging.SubProtocolWebSocketHandler: 330 - Terminating session id 'nro1ww4x' 
org.springframework.web.socket.handler.SessionLimitExceededException: The send buffer size 1147188 bytes for session 'nro1ww4x exceeded the allowed limit 1051648 
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.sessionLimitReached(ConcurrentWebSocketSessionDecorator.java:162) ~[ConcurrentWebSocketSessionDecorator.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.checkSessionLimits(ConcurrentWebSocketSessionDecorator.java:150) ~[ConcurrentWebSocketSessionDecorator.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.sendMessage(ConcurrentWebSocketSessionDecorator.java:105) ~[ConcurrentWebSocketSessionDecorator.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageToClient(StompSubProtocolHandler.java:276) ~[StompSubProtocolHandler.class:4.0.6.RELEASE] 
    at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.handleMessage(SubProtocolWebSocketHandler.java:326) ~[SubProtocolWebSocketHandler.class:4.0.6.RELEASE] 
    at org.springframework.messaging.support.ExecutorSubscribableChannel$1.run(ExecutorSubscribableChannel.java:70) [ExecutorSubscribableChannel$1.class:4.0.6.RELEASE] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_20] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_20] 
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_20] 
2014-10-24 16:39:33,876 WARN ort.session.WebSocketServerSockJsSession: 285 - Failed to send SockJS close frame: The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid state for called method 
2014-10-24 16:39:34,833 ERROR standard.StandardWebSocketHandlerAdapter: 55 - Closing due to exception for WebSocket session id=0 

Я попытался с увеличением размера буфера также но через какое-то время он дает такое же исключение. как только размер буфера достигнут.

Я думаю, что буфер сеанса websocket не освобожден после отправки сообщения.

Есть ли какие-либо настройки для таких же? Я пропустил какую-либо конфигурацию?

+0

ли вы решить эту проблему? Я сталкиваюсь с той же проблемой –

+0

разрешен путем добавления registration.setMessageSizeLimit (102400 * 1024); –

ответ

-1

Решенного путем добавления

public void configureWebSocketTransport(WebSocketTransportRegistration registration) { 
registration.setMessageSizeLimit(102400* 1024); 
} 
+0

Это не ответ, это в лучшем случае неполное. Где вы это добавили ?! – FAS

2

Попробуйте настроить веб-сокет на стороне сервера. Что-то вроде этого Int класса WebSocketConfig:

public void configureWebSocketTransport(WebSocketTransportRegistration registration) { 
    registration.setMessageSizeLimit(500 * 1024); 
    registration.setSendBufferSizeLimit(1024 * 1024); 
    registration.setSendTimeLimit(20000); 
}