Как заставить отключение в commons-httpclient? - PullRequest
4 голосов
/ 04 февраля 2010

Я использую commons-httpclient для отправки запросов на веб-сервер. Веб-сервер никогда не закрывает соединения, но имеет небольшую утечку памяти, связанную с контекстом соединения.

Поэтому я бы хотел время от времени закрывать постоянные соединения (например, каждый X-запрос), но я не нашел способа сделать это. Я использую MultiThreadedHTTPConnectionManager

Я мог бы использовать MultiThreadedHTTPConnectionManager.closeIdleConnections (very_small_delay), но это не очень надежно: если мой Java-код имеет много работы, то возможно, что ни одно соединение не будет простаивать, потому что всегда есть другие потоки, ожидающие свободного соединения .

Спасибо

Ответы [ 4 ]

2 голосов
/ 04 февраля 2010

после выполнения одного метода, скажем, GET, вы можете прочитать ответный номер HttpStatus, чтобы решить, нужно ли вызывать method.releaseConnection ().

Или, если вы знаете, какое соединение вы хотите закрыть, вы можете попробовать

MultiThreadedHTTPConnectionManager
void    releaseConnection(HttpConnection conn) 

хорошо, я думал, у вас есть причина, по которой вы хотите «убить» соединение. Предположим, у вас есть соединение, объект HttpConnection, который вы хотите закрыть в руке. Может ли этот метод помочь?

HttpConnection
public void close()

    Closes the socket and streams. 
1 голос
/ 04 февраля 2010

Вы звоните method.releaseConnection()?

http://hc.apache.org/httpclient-3.x/threading.html#Connection_Release

0 голосов
/ 16 февраля 2015

Когда я использую releaseConnections(), все еще существуют соединения в состоянии CLOSE_WAIT. Это нормально, если я добавлю closeIdleConnections(0) после releaseConnections?

Будет ли это означать, даже если соединение отправляется обратно в пул для использования другими клиентами, но не закрывается / не освобождается, тогда closeIdleConnections закроет его?

0 голосов
/ 28 ноября 2012

Можете ли вы позволить себе использовать SimpleHttpConnectionManager(boolean alwaysClose)?

httpClient.setHttpConnectionManager(new SimpleHttpConnectionManager(true))
...