java 的httpentity_java – 为什么作者使用EntityUtils.consume(httpEntity);?

真正归结为“好公民”(真正了解HTTPClient接口的合同)。

EntityUtils.consume将会释放所有由httpEntity所持有的资源,这本质上意味着释放任何底层Stream,并将Connection对象返回到其池中(在连接管理器是多线程的情况下)或释放连接管理器,以便它可以处理下一个请求。

如果不消耗实体,那么真正取决于finally子句中的“关闭连接管理器”的意思。它会关闭尚未发送回池的待处理流/连接吗?我不知道它会合同做什么(尽管我认为它是实现的)。如果没有,那么您可能会泄漏系统资源(套接字等)。

发生什么也可能取决于可能(如果它被执行)的Entity对象的可能的完成方法释放其资源,再次,不确定它在实体的合同中这样做。

让我们假设ConnectionManager在关闭时实际上正确地关闭所有待处理的资源。你还需要消费实体吗?我说是的,因为一个月后,有人会修改你的代码,并在同一个try / finally块中进行第二个HTTP调用,并且可能无法这样做,因为你没有以你应该拥有的方式释放资源(例如,你的客户端是在一个连接池,不释放第一个连接会使第二个调用失败)。

所以我的观点是:实体是资源,资源在不需要的时候应该被释放。稍后计数别人为你释放可能会在将来伤害你。原作者可能会想到这些。

作为附注,请注意,您写的实现实际上将消耗读者直到底层流的结尾,所以消费调用实际上根本不会做任何事情,但在我看来,这是一个实现细节(从我的头顶,一旦响应流被完全读取,连接对象将自动释放/发回到http客户端的池中)。还要注意,如果您使用API​​提供的ResponseHandler专业知识,所有这些消费逻辑也将从您抽象出来。最后,API不保证response.getEntity永远不会返回null,所以你应该检查它以避免NullPointerException。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值