Открытые TCP-соединения Java/Tomcat — монитор ресурсов

Прямо сейчас мы сталкиваемся с проблемой, когда у нас есть куча «открытых TCP-соединений» на нашем сервере Windows, на которых работает веб-сервер tomcat. Код Java выполняет вызов SOAP к поставщику, и мы видим множество открытых соединений в мониторе ресурсов (на рисунке ниже), показывающих IP-адрес поставщика. Я пробовал несколько разных методов выполнения вызова SOAP, думая, что соединение явно не закрывается где-то за кулисами. Пока ничего не сработало, поэтому я думаю, что могу неправильно понять, что на самом деле показывает эта страница.

 TCP-соединения Windows Resource Monitor с несколькими java.exe (не выделены серым цветом) с IP-адресом поставщика

Каков жизненный цикл TCP-подключения по отношению к монитору ресурсов Windows? Нормально ли, что соединения, которые больше не используются, остаются какое-то время неактивными? Если нет, то как исправить ситуацию?


person mandelbug    schedule 13.02.2019    source источник


Ответы (1)


Это будет либо пул соединений, либо утечка ресурсов в вашем коде.

Чтобы убедиться, что это не утечка ресурсов, проверьте свой код, чтобы убедиться, что любой объект, выполняющий сетевой вызов, закрывает соединение после его использования, иначе вы будете ждать, пока запустится сборщик мусора.

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

Нет пула или постоянства на уровне Windows Winsock. Если базовый сокет закрывается, то все, он закрывается.

person Andy Brown    schedule 18.02.2019
comment
Клиентский API — это просто веб-сервис SOAP, размещенный нашим поставщиком. Я использовал несколько разных методов для подключения к нему. Последний использовал javax.xml.soap.SOAPConnection, javax.xml.soap.SOAPMessage и т. д. Я явно закрываю его, используя soapConnection.close(); в блоке finally. Этот вызов происходит в результате веб-службы Axis2, которую мы размещаем. Наши внутренние приложения вызывают сервис, а мы звоним поставщику. Может быть, Axis2 что-то делает для объединения соединений? - person mandelbug; 19.02.2019
comment
Не знаком с Axis2, но это продукт Apache, поэтому он может использовать их HttpClient под прикрытием. HttpClient определенно может управлять пулом соединений для SOAP через соединения HTTP/1.1. Возможно, есть способ получить и настроить лежащий в основе HttpClient и его диспетчер соединений. - person Andy Brown; 20.02.2019