真正归结为成为“好公民”(并且真正了解
HTTPClient接口契约)。什么
EntityUtils.consume会做的是释放被持有的所有资源
httpEntity,这实质上意味着释放任何基础流,并给予Connection对象返回到其池(在的情况下你的连接管理器是一个多线程的一个)或释放连接管理器,以便它可以处理下一个要求。
如果您不使用
entity,则实际发生的情况取决于在finally子句中“关闭连接管理器”的含义。它将关闭尚未发送回池的未决流/连接吗?我不确定它是否会按照合同进行(尽管在实现方面,我认为确实如此)。如果没有,那么您可能正在泄漏系统资源(套接字等)。发生的事情还可能取决于Entity对象的可能的终结方法,该方法可能(如果要执行的话)释放其资源,同样,不确定这样做是否在实体的合同中。
让我们假设一分钟,它
ConnectionManager实际上在关闭时会正常关闭所有未决资源。您还需要使用实体吗?我说是,因为从现在开始的一个月后,有人将在同一try
/
finally块中修改您的代码并进行第二个HTTP调用,并且可能无法这样做,因为您没有按照应有的方式释放资源(例如,如果客户端位于单个连接池上,则不释放第一个连接将使第二个呼叫失败。
因此,我的观点是:实体是资源,在不需要资源时应将其释放。指望别人在以后为您释放他们可能会伤害您将来。原始作者可能已经按照这些思路进行了思考。
附带说明一下,请注意,您编写的实现实际上将消耗读者直到基础流的末尾,因此,消耗调用实际上将什么也不做,但是我认为,这是实现的细节(我的头顶是,一旦完全读取了响应流,连接对象就会自动释放/发送回http客户端的池中。还请注意,如果您使用API提供的ResponseHandler机制,那么所有这些Consume逻辑也会从您身上抽象出来。最后,API不能保证
response.getEntity永远不会返回null,因此您应该检查避免使用
NullPointerException。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)