Клиент Java SockJS Spring и размер сообщения

Используя Java-клиент SockJS, я пытаюсь подключиться к серверу Spring sockjs и получаю ошибку 1009 для сообщений (без заголовков) размером ~ 20 КБ. Библиотека Javascript работает нормально.

Transport closed with CloseStatus[code=1009, reason=The decoded text message was too big 
for the output buffer and the endpoint does not support partial messages] in WebSocketClientSockJsSession
[id='9fa30eb453e14a8c8612e1064640646a, url=ws://127.0.0.1:8083/user]

У меня есть пара классов конфигурации на сервере (на данный момент я не знаю, настраиваю ли я эти вещи чаще, чем необходимо):

@Configuration
@EnableWebSocket
public class WebSocketTransportConfig implements WebSocketConfigurer {
    // Important web socket setup. If big message is coming through, it may overflow the buffer and this will lead in disconnect.
    // All messages that are coming through normally (including snapshots) must be order of magnitude smaller, or connection will be broken
    // sometimes
    // There is also MaxBinaryMessageSize that we do not employ as we use Stomp, but for completeness it is also set to same values.
    // Javadoc http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.html#setTextMessageSizeLimit-int-

    public static final int MAX_TEXT_MESSAGE_SIZE = 2048000; // 2 Megabytes.
    public static final int BUFFER_SIZE = MAX_TEXT_MESSAGE_SIZE * 5;


    private static final Logger LOGGER = LogManager.getLogger(WebSocketTransportConfig.class);

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

    }

    @Bean
    public DefaultHandshakeHandler handshakeHandler() {
        LOGGER.info("Websocket buffer size: " + BUFFER_SIZE + " bytes.");
        WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
        policy.setMaxTextMessageBufferSize(BUFFER_SIZE);
        policy.setMaxTextMessageSize(MAX_TEXT_MESSAGE_SIZE);
        policy.setMaxBinaryMessageBufferSize(BUFFER_SIZE);
        policy.setMaxBinaryMessageSize(MAX_TEXT_MESSAGE_SIZE);
        policy.setInputBufferSize( BUFFER_SIZE);
        policy.setIdleTimeout(600000);

        return new DefaultHandshakeHandler(
                new JettyRequestUpgradeStrategy(new WebSocketServerFactory(policy)));
    }
}

и

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketBrokerConfig extends WebSocketMessageBrokerConfigurationSupport implements WebSocketMessageBrokerConfigurer {


    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
        // Increase buffers. 
        // Too little buffers may result in fatal errros when transmitting relatively large messages.
        registry.setMessageSizeLimit(WebSocketTransportConfig.MAX_TEXT_MESSAGE_SIZE);
        registry.setSendBufferSizeLimit(WebSocketTransportConfig.BUFFER_SIZE);
        super.configureWebSocketTransport(registry);
    }
}

Согласно сообщение веб-сокета Stomp Spring превышает ограничение по размеру, которое должно help, но при подключении клиента Java Spring SockJS я все равно получаю ошибку 1009 (слишком большое сообщение).

Я подозреваю, что у меня может быть одна из двух проблем:

  1. Клиент Java SockJS также должен быть настроен на ПОЛУЧЕНИЕ сообщений большего размера.
  2. Или я все еще неправильно настроен на сервере.

Как увеличить размер буфера в клиенте Java SockJS Spring?


person Askar Ibragimov    schedule 12.07.2016    source источник
comment
Вы решили это?   -  person gstackoverflow    schedule 10.07.2017


Ответы (2)


Я столкнулся с той же проблемой. Все дело в конфигурации клиента, а не сервера. Вы можете создать экземпляр WebSocketContainer и настроить его.

WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxBinaryMessageBufferSize(your_size);
container.setDefaultMaxTextMessageBufferSize(your_size);
WebSocketClient transport = new StandardWebSocketClient(container);
WebSocketStompClient stompClient = new WebSocketStompClient(transport);

your_size - размер в байтах.

person Aleksey Balenko    schedule 01.09.2017
comment
Большое спасибо! Это решило мою проблему. Я пытался отправить сообщение STOMP большого размера, и это решило проблему! - person atom88; 27.04.2018
comment
Хотя ответ был давным-давно, это меня спасает! - person nguyenbkcse; 21.11.2019
comment
Есть идеи по поводу рекомендуемого максимального размера, который не должен превышать? - person edoDev; 25.11.2019

Если вы делаете это так:

SockJsClient sockJsClient = new SockJsClient(transports);
    WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);

Пытаться:

stompClient.setInboundMessageSizeLimit(your_message_size_limit);
person mrUwa    schedule 26.01.2017
comment
это не помогает - person gstackoverflow; 10.07.2017