2014-04-14 4 views
2

Я пытаюсь использовать HttpClient, и у меня возникают проблемы с расшифровкой значения 1.1.5. Ensuring release of low level resources.Повторное использование соединения HttpClient с 4.3.x

Это как закрытие потока контента и закрытие ответа интерпретируются?

Закрытие потока контента: (сохраняет основную связь живых)

CloseableHttpClient httpclient = HttpClients.createDefault(); 
try { 
    HttpGet httpget = new HttpGet("http://localhost/"); 

    // do multiple times on the same connection 
    for (...) { 
     HttpResponse response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 

     if (entity != null) { 
      try { 
       // do something useful 
      } finally { 
       EntityUtils.consume(entity); // <-- ensures reuse 
      } 
     } 
    } 
} finally { 
    httpclient.close(); 
} 

Закрытие ответ: (немедленно выключается и сбрасывает соединение)

CloseableHttpClient httpclient = HttpClients.createDefault(); 
try { 
    HttpGet httpget = new HttpGet("http://localhost/"); 

    // do multiple times on different connections 
    for (...) { 
     ClosableHttpResponse response = httpclient.execute(httpget); 
     try { 
      HttpEntity entity = response.getEntity(); 
      if (entity != null) { 
       // do something useful 
      } 
     } finally { 
      response.close(); // <-- ensures reconnect 
     } 
    } 
} finally { 
    httpclient.close(); 
} 

ответ

1

В общем, как только вы закончите с сущностью, которую хотите отбросить, чтобы системные ресурсы не были связаны с объектами, которые больше не имеют смысла. На мой взгляд, единственным отличием здесь является использование. Эта глава об основных принципах в основном описывает этот момент. Однако вы его реализуете, убедитесь, что используете ресурсы только столько, сколько вам нужно. Ресурс низкого уровня - это InputStream в сущности, ресурс высокого уровня - это соединение. Если вы реализуете что-то, что не нужно читать полный InputStream, чтобы сделать определение, например, просто прекратите ответ, и очистка будет обработана для вас эффективно.

1

entityUtils.consume закрывает поток для вас ...

if (entity.isStreaming()) { 
    final InputStream instream = entity.getContent(); 
    if (instream != null) { 
     instream.close(); 
    } 
} 

Вы просто «отпустить» своего клиента обратно в бассейн ...

Затем вы должны обернуть HttpClient в работоспособной ...

public void run() { 
    handler.sendMessage(Message.obtain(handler, HttpConnection.DID_START)); 
    CloseableHttpClient httpClient = HttpClients.custom() 
      .setConnectionManager(YourConnectionMgr.getInstance()) 
      .addInterceptorLast(new HttpRequestInterceptor() { 
       public void process(
        final HttpRequest request, 
        final HttpContext context) throws HttpException, IOException { 
        } 
       }) 
       .build(); 
} //end runnable 

на endof работоспособной, клиент просто получает выпущен обратно в ConnectionPool и вам не придется беспокоиться о ресурсах или очистки.

Используйте менеджер, который расширяет PoolingClientConnectionManager

newInstance = new MyConnectionManager(schemeRegistry); 
    instance.setMaxTotal(15); 
    instance.setDefaultMaxPerRoute(15); 
    HttpHost localhost = new HttpHost("api.parse.com", 443); 
    instance.setMaxPerRoute(new HttpRoute(localhost), 10); 

Тогда в конце концов, я думаю, что вам не нужно выключать бассейн.

YourConnectionMgr.getInstance().shutdown(); 
YourConnectionMgr.reset(); 

Подробнее here

Смежные вопросы