Медленно ли работает сеанс websocket # setMaxTextMessageBufferSize и можно ли установить его динамически - PullRequest
1 голос
/ 04 мая 2019

У меня есть куча (около 6 ... скажем B1-B6 ) контейнеров Tomcat, подключенных через веб-сокеты к контейнеру Tomcat, скажем C , в котором находится приложение панели управления. .

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

Я установил session.setMaxTextMessageBufferSize равным 10 КБ в методе onOpen классов ServerEndPoint и ClientEndPoint.

Обмен сообщениями работает нормально, но иногда генерируются некоторые данные, размер которых превышает максимальный размер буфера TextMessage для сеансов.

У меня была идея сделать что-то вроде:

 public boolean write(String message) {

        Worker w = this;//This is the Worker class, so i can do `this`

        while (!w.getSessions().isEmpty()) {
            //Ask for a session
            Session session = w.getSessions().poll();

            if (session != null) {
                //Session granted
                synchronized (session) {
                    int defaultBufferSize = session.getMaxTextMessageBufferSize();
                    int bytesToTransmit = message.getBytes().length;
                    if (defaultBufferSize <= bytesToTransmit) {
                        //increase the maximum buffer size to accomodate large messages
                        session.setMaxTextMessageBufferSize(bytesToTransmit + 16);
                    }

                    try {
                        //send your message in peace?
                        session.getBasicRemote().sendText(message);
                        //return connection to the pool.
                        w.getSessions().offer(session);
                               //Reset to the default buffer size to ..maybe reclaim memory?
                        session.setMaxTextMessageBufferSize(defaultBufferSize);
                        return true;
                    } catch (IOException ex) {
                        ex.printStackTrace(); 
                    }
                }
            }

        }

        return false;
    }

То есть, сравнивайте размер байта текста, который должен быть передан, с максимальным размером буфера сеанса и, если сеанс не может вместить его, увеличьте размер буфера сеанса.

Однако у меня есть глубокое подозрение, что это может не сработать по какой-то странной причине.

  1. Будет ли это вообще работать?
  2. Что может пойти не так в производстве?
  3. Скажите, это работает, процесс установки максимального размера буфера, дорогой?

    Однажды я наблюдал, как Tomcat выделяет память на основе максимального размера буфера, который я установил для пула соединений ранее. Поэтому я предполагаю, что происходит некоторое выделение памяти (и освобождение?).

Это действительно так?

Спасибо.

ОБРАТИТЕ ВНИМАНИЕ

Я знаю о частичных сообщениях и ограничении разрешенного размера входящего сообщения в аннотации OnMessage. Однако я не хочу использовать ни один из этих подходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...