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

作者为什么使用EntityUtils.consume(httpEntity);?,第1张

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

真正归结为成为“好公民”(并且真正了解

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

如果您不使用

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

让我们假设一分钟,它

ConnectionManager
实际上在关闭时会正常关闭所有未决资源。您还需要使用实体吗?我说是,因为从现在开始的一个月后,有人将在同一try
/
finally块中修改您的代码并进行第二个HTTP调用,并且可能无法这样做,因为您没有按照应有的方式释放资源(例如,如果客户端位于单个连接池上,则不释放第一个连接将使第二个呼叫失败。

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

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

response.getEntity
永远不会返回null,因此您应该检查避免使用
NullPointerException



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存