У меня есть куча (около 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;
}
То есть, сравнивайте размер байта текста, который должен быть передан, с максимальным размером буфера сеанса и, если сеанс не может вместить его, увеличьте размер буфера сеанса.
Однако у меня есть глубокое подозрение, что это может не сработать по какой-то странной причине.
- Будет ли это вообще работать?
- Что может пойти не так в производстве?
Скажите, это работает, процесс установки максимального размера буфера, дорогой?
Однажды я наблюдал, как Tomcat выделяет память на основе максимального размера буфера, который я установил для пула соединений ранее. Поэтому я предполагаю, что происходит некоторое выделение памяти (и освобождение?).
Это действительно так?
Спасибо.
ОБРАТИТЕ ВНИМАНИЕ
Я знаю о частичных сообщениях и ограничении разрешенного размера входящего сообщения в аннотации OnMessage. Однако я не хочу использовать ни один из этих подходов.