gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:46:15 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com