HttpClient 4.0.1 - как освободить соединение? - PullRequest
70 голосов
/ 23 января 2011

У меня есть цикл для нескольких URL, для каждого из которых я делаю следующее:

private String doQuery(String url) {

  HttpGet httpGet = new HttpGet(url);
  setDefaultHeaders(httpGet); // static method
  HttpResponse response = httpClient.execute(httpGet);   // httpClient instantiated in constructor

  int rc = response.getStatusLine().getStatusCode();

  if (rc != 200) {
    // some stuff...
    return;
  }

  HttpEntity entity = response.getEntity();

  if (entity == null) {
    // some stuff...
    return;
  }

  // process the entity, get input stream etc

}

Первый запрос в порядке, второй выдает это исключение:

Исключение в теме "главная" java.lang.IllegalStateException: Неправильное использование SingleClientConnManager: соединение еще выделено. Не забудьте выпустить соединение перед выделением другой. в org.apache.http.impl.conn.SingleClientConnManager.getConnection (SingleClientConnManager.java:199) в org.apache.http.impl.conn.SingleClientConnManager $ 1.getConnection (SingleClientConnManager.java:173) ......

Это просто однопоточное приложение. Как я могу освободить это соединение?

Ответы [ 12 ]

0 голосов
/ 30 января 2018

Настоятельно рекомендуем использовать обработчик для обработки ответа.

client.execute(yourRequest,defaultHanler);

Соединение будет разорвано автоматически методом consume(HTTPENTITY).

Пример обработчика:

private ResponseHandler<String> defaultHandler = new ResponseHandler<String>() {
    @Override
    public String handleResponse(HttpResponse response)
        throws IOException {
        int status = response.getStatusLine().getStatusCode();

        if (status >= 200 && status < 300) {
            HttpEntity entity = response.getEntity();
            return entity != null ? EntityUtils.toString(entity) : null;
        } else {
            throw new ClientProtocolException("Unexpected response status: " + status);
        }
    }
};
0 голосов
/ 05 мая 2015

У меня была такая же проблема, и я решил ее, закрыв ответ в конце метода:

try {
    // make the request and get the entity 
} catch(final Exception e) {
    // handle the exception
} finally {
    if(response != null) {
        response.close();
    }
}
...