PoolingClientConnectionManager PoolStats и потенциальная проблема утечки соединения

Я использую PoolingClientConnectionManager и подозреваю, что у меня есть утечка соединений. У меня есть поток мониторинга, который распечатывает PoolStats, как показано ниже:

[leased: 126; pending: 0; available: 14; max: 140]
..
[leased: 140; pending: 20; available: 0; max: 140]
..
[leased: 140; pending: 10; available: 0; max: 140]

Я порождаю равное количество потоков числу подключений к пулу (140), поэтому я никогда не ожидал, что арендованный + ожидающий> макс. Это предположение верно? Или это случай соединений, поддерживаемых менеджером? Я не уверен, что в этом случае соединения относятся к "аренде" или "доступны".

Я заметил, что утечка соединения может произойти, если соединение HttpClient прервано во время разрешения DNS. В этом случае арендованные соединения не возвращаются обратно в пул. Существует ли предлагаемый способ отмены распределения надлежащих ресурсов, чтобы соединения были возвращены обратно в пул?

Заранее спасибо.

1 ответ

Да, вполне вероятно, что произошла утечка соединения. Маловероятно, что поиск DNS может быть причиной этого, хотя. Предполагается, что HttpClient автоматически освобождает соединение в случае возникновения ошибок ввода-вывода, протокола или времени выполнения.

Что касается освобождения ресурса, то правило должно быть довольно простым: до тех пор, пока существует объект, связанный с ответом, необходимо убедиться, что его содержимое полностью используется. HttpClient 4.2 и HttpClient 4.3 также предоставляют дополнительные меры безопасности для освобождения ресурсов в исключительных случаях: HttpUriRequest#releaseConnection в 4.2 и CloseableHttpResponse#close в 4.3

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

Другие вопросы по тегам