Освобождение соединений при использовании PoolingClientConnectionManager?

Я использую Apache DefaultHttpClient с PoolingClientConnectionManager и BasicResponseHandler. Они совместно используются разными потоками, и каждый поток создает собственное расширение HttpRequestBase.

Нужно ли мне вручную сообщать менеджеру о завершении использования соединения при использовании BasicResponseHandlers? Нужно ли мне обернуть его в finally, чтобы исключения не вызывали утечку соединения?

Другими словами, нужно ли мне это делать?

HttpGet get = new HttpGet(address);
try {
  httpclient.execute(get, new BasicResponseHandler());
} finally {
  get.reset();
}

или этого достаточно?

HttpGet get = new HttpGet(address);
httpclient.execute(get, new BasicResponseHandler());

Я не нашел четкого ответа в документации Apache.




Ответы (1)


Этого достаточно и рекомендуется.

HttpClient#execute методы гарантированно автоматически освобождают все ресурсы, связанные с запросом, в случае исключения (либо ввода-вывода, либо времени выполнения). Когда ответ HTTP обрабатывается с помощью ResponseHandler, базовое соединение автоматически возвращается к диспетчеру соединений во всех случаях.

person ok2c    schedule 05.12.2012
comment
Это было мое предположение, но я хотел бы увидеть лучшее объяснение или ссылку на какой-нибудь авторитетный источник. - person Eyal; 06.12.2012
comment
@Eyal См. комментарий к «Обработке ответов» по ​​адресу http://hc.apache.org/httpcomponents-client-ga/examples.html - person ok2c; 06.12.2012
comment
@oleg Но этот пример однопоточный, и, поскольку они вызывают shutdown () в предложении finally, разрыв соединения гарантирован. Меня беспокоит, скажем, исключение во время работы ResponseHandler, из-за которого диспетчер соединений будет думать, что соединение все еще используется. - person Eyal; 06.12.2012
comment
@Eyal Реализация HttpClient по умолчанию полностью потокобезопасна. Пока реализация ResponseHandler не имеет состояния или ориентирована на многопотоковое исполнение, вам не о чем беспокоиться. Не стесняйтесь изучить исходный код http://hc.apache.org/httpcomponents-client-ga/httpclient/xref/org/apache/http/impl/client/AbstractHttpClient.html#1055 - person ok2c; 06.12.2012