Undertow on Spring пропускает соединения

Я использую Spring Boot (1.3.O.M5) с Undertow. Недавно я обнаружил, что при использовании

lsof -p $(pidof java)

команда через несколько часов выдает мне около 700 строк, большинство из которых являются установленными TCP-соединениями с клиентами, хотя почти никто не заходил на страницу в последний час (и когда я подключаюсь к сайту, мое соединение пропадает примерно через 5 минут).

Скорее всего, это источник моего java.net.SocketException: слишком много открытых файлов, которые я получал каждые пару дней (требуя от меня перезапуска приложения), прежде чем я заметил устаревшие соединения. Я увеличил максимальное количество открытых файлов в системе, но это явно временное решение.

Буду признателен за помощь в вопросе. Спасибо!


person Jakub Kozłowski    schedule 09.09.2015    source источник
comment
Кроме того, bean-компонент UndertowEmbeddedServletContainerFactory с setSessionTimeout(3) не сокращает время ожидания сеанса до 3 секунд. Также не было server.session.timeout=3 :(   -  person Jakub Kozłowski    schedule 09.09.2015
comment
Какие связи? Внешний? Во внутренние системы? Выясните соединения, чтобы понять, в какой части приложения это происходит. Кроме того, тайм-аут сеанса предназначен для сеансов HTTP и ничего не делает для соединений.   -  person M. Deinum    schedule 09.09.2015
comment
Вот что я подумал, так как я увидел недвижимость. Хотя попробовать никогда не помешает. Соединения — это просто TCP-соединения с устройствами, посещающими веб-сайт.   -  person Jakub Kozłowski    schedule 09.09.2015
comment
Могут ли устройства, поддерживающие открытые соединения, зависеть от устройства/ОС? Прошло некоторое время, но, вероятно, есть способы установить время ожидания соединения на сервере или закрыть неактивные соединения.   -  person M. Deinum    schedule 09.09.2015
comment
Я не знаю. Соединения, кажется, осуществляются из мобильных сетей (я вижу в адресах имена операторов — по крайней мере, в подавляющем большинстве), и это все, что я о них знаю.   -  person Jakub Kozłowski    schedule 10.09.2015


Ответы (2)


Undertow не имеет времени ожидания соединения по умолчанию, вам нужно установить его, используя что-то вроде:

Undertow.builder().setServerOption(UndertowOptions.NO_REQUEST_TIMEOUT, 60000)

Это укажет Undertow закрыть соединение через 60 с без запросов от клиента.

person Stuart Douglas    schedule 10.02.2016
comment
Я только что изменил это в восходящем потоке Undertow на значение по умолчанию 10 минут, см. issues.jboss.org/browse/ ПОДЪЕМ-630 - person Stuart Douglas; 10.02.2016
comment
Я установил его в Application.main сразу после запуска SpringApplication... и, написав это, я понимаю, что, вероятно, должен был сделать это перед запуском приложения, но это не работает с банкоматом. У меня было 200 открытых файлов при запуске приложения в prod, а сейчас у меня 600, и около 7 устройств обращаются к веб-сайту. - person Jakub Kozłowski; 10.02.2016

Попробуйте установить httpServerExchange.setPersistent(false);, это помогает мне, когда у меня были такие же проблемы. И да - это вызывает слишком много ошибок открытых файлов, потому что превышает лимит файловых дескрипторов.

person Alexandr Radchykov    schedule 13.11.2015