所引用的代码位于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/