我遇到过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
。
代码A来自项目,您可以看到它。 我不知道作者为什么将设计为,这是因为代码不太复杂,被多次调用。 我认为代码B可以很好地工作,对吗? 代码B
问题内容: 我有一个将对象保存到数据库的EJB。在我看到的一个示例中,一旦保存了此数据(EntityManager.persist),就会调用EntityManager.flush();。为什么我需要这样做?我要保存的对象未附加,以后在该方法中也不会使用。实际上,一旦保存,该方法就会返回,并且我希望资源会被释放。(示例代码也在remove调用上执行此操作。) 问题答案: 调用将强制数据立即被持久保
本文向大家介绍消费者API的作用是什么?相关面试题,主要包含被问及消费者API的作用是什么?时的应答技巧和注意事项,需要的朋友参考一下 答:允许应用程序订阅一个或多个主题并处理生成给它们的记录流的API,我们称之为消费者API。
/usr/local/kafka2.12-2.6.0/config/server.properties 在开始动物园管理员和Kafka之后,创建一个新的主题 检查所有三个节点上的集群状态
问题内容: 谁能帮助解释为什么JNDI应该是公开数据库/ jms等服务的首选方式? 我遇到的所有帖子都谈到了不必加载特定的驱动程序管理器,从连接池中受益等优点,但是可以通过在属性文件中指定驱动程序管理器并使用反射来轻松实现。 连接池也可以通过将正确的实现方式通过spring或其他方式连接到应用Bean中来实现。 那么,为什么使用JNDI会更好呢? 问题答案: 当您必须在不同环境之间移动应用程序时,
我经常看到函数或方法返回Result 换句话说,这种返回不会返回任何内容或错误。为什么使用会导致这种情况,而不是一种选择?我认为这个选项更合适,因为在我们的示例中,它实际上不返回任何值或值——无或错误。