java - 在以下使用 PoolingHttpClientConnectionManager 的 Apache HttpClient 中,如何完成资源清理?

标签 java apache-httpclient-4.x

所引用的代码位于this question on codereview forum下.

当您在查询方法中执行此 HttpClientPool.getClient().execute(request), r) 时,您已经使用客户端发送了 HttpRequest.. 不需要释放/清理任何资源吗?

是否监视线程

while ((stopRequest = stopSignal.poll(5, TimeUnit.SECONDS)) == null) {
      // Close expired connections
      cm.closeExpiredConnections();
      // Optionally, close connections that have been idle too long.
      cm.closeIdleConnections(60, TimeUnit.SECONDS);
      // Look at pool stats.
      log.trace("Stats: {}", cm.getTotalStats());
    }

足以释放从池中获取的客户端正在使用的连接。

几个问题:

  • 这是否意味着我们让连接过期或闲置以供池回收?
  • 过期和闲置有什么区别?
  • 物理连接、Connection对象、ConnectionManager对象、HttpClient对象的生命周期是如何维护的以及它们之间的关系是什么?

很抱歉提出业余问题。我是 HttpClient 的新手。

最佳答案

主要清理发生在 readResponse 方法中,其中 content.close(); 然后是 response.close();

该机制的核心是:

    // Start a conversation.
    CloseableHttpResponse response = HttpClientPool.getClient().execute(request);

getClient() 从客户端池中提取 CloseableHttpClient。这实际上是一个 Singleton 线程安全客户端,因此不需要整理,它在内部管理多个用途。

execute 执行请求并返回 CloseableHttpResponse 进行解析和处理。这是通过在 readResponse 中调用 close 来清理的。请注意,它在 finally 子句中关闭,以确保它不会泄漏。

    // Roll out the results
    HttpEntity entity = response.getEntity();
    if (entity != null) {
      InputStream content = entity.getContent();

readResponse中,创建一个新的InputStream来收集响应的内容 - 这也可以通过finally子句中的闭包进行正确清理.

空闲线程仅用于挂起意外事件留下的连接,它当然不是主要的清理机制。

关于java - 在以下使用 PoolingHttpClientConnectionManager 的 Apache HttpClient 中,如何完成资源清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29635769/

相关文章:

java - 执行循环程序

java - HTTPClient - 捕获所有重定向的列表

java - CURL 命令通过时 HttpClient java.net.UnknownHostException 异常

java - Apache HttpClient : How to auto close connections by server's keep-alive time?

java - Google 登录按钮空指针异常

java - 应用程序在某些操作系统上崩溃(使用 AWT 的 Swing)

java - 拆分数学表达式

java - 通过属性文件传递服务器 URL 在 apache http 客户端中不起作用

java - ElasticSearch 和 Apache HttpAsyncClient

Java泛型问题