作者为什么使用EntityUtils.consume(httpEntity);?

我遇到过EntityUtils.consume(httpEntity);,我不确定它到底在做什么。

例如:

try {

//... some code

HttpEntity httpEntity = httpResponse.getEntity();

BufferedReader br = new BufferedReader(new InputStreamReader(http.Entity.getContent()));

String line;

while ((line = br.readLine())!= null) {

System.out.println(line);

}

EntityUtils.consume(httpEntity);

} catch (Exception e) {

//code

} finally {

httpClient.getConnectionManager().shutdown();

}

作者为什么要EntityUtils.consume(httpEntity);finally块关闭连接和垃圾收集器处理时输入httpEntity

回答:

真正归结为成为“好公民”(并且真正了解HTTPClient接口契约)。什么EntityUtils.consume会做的是释放被持有的所有资源httpEntity,这实质上意味着释放任何基础流,并给予Connection对象返回到其池(在的情况下你的连接管理器是一个多线程的一个)或释放连接管理器,以便它可以处理下一个要求。

如果您不使用entity,则实际发生的情况取决于在finally子句中“关闭连接管理器”的含义。它将关闭尚未发送回池的未决流/连接吗?我不确定它是否会按照合同进行(尽管在实现方面,我认为确实如此)。如果没有,那么您可能正在泄漏系统资源(套接字等)。发生的事情还可能取决于Entity对象的可能的终结方法,该方法可能(如果要执行的话)释放其资源,同样,不确定这样做是否在实体的合同中。

让我们假设一分钟,它ConnectionManager实际上在关闭时会正常关闭所有未决资源。您还需要使用实体吗?我说是,因为从现在开始的一个月后,有人将在同一try

/

finally块中修改您的代码并进行第二个HTTP调用,并且可能无法这样做,因为您没有按照应有的方式释放资源(例如,如果客户端位于单个连接池上,则不释放第一个连接将使第二个呼叫失败。

因此,我的观点是:实体是资源,在不需要资源时应将其释放。指望别人在以后为您释放他们可能会伤害您将来。原始作者可能已经按照这些思路进行了思考。

附带说明一下,请注意,您编写的实现实际上将消耗读者直到基础流的末尾,因此,消耗调用实际上将什么也不做,但是我认为,这是实现的细节(我的头顶是,一旦完全读取了响应流,连接对象就会自动释放/发送回http客户端的池中。还请注意,如果您使用API​​提供的ResponseHandler机制,那么所有这些Consume逻辑也会从您身上抽象出来。最后,API不能保证response.getEntity永远不会返回null,因此您应该检查避免使用NullPointerException

以上是 作者为什么使用EntityUtils.consume(httpEntity);? 的全部内容, 来源链接: utcz.com/qa/434432.html

回到顶部