为什么 Apache CloseableHttpResponse 在关闭时不使用实体? [英] Why does Apache CloseableHttpResponse not consume the entity on close?

查看:27
本文介绍了为什么 Apache CloseableHttpResponse 在关闭时不使用实体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

查看快速入门指南 它给出了以下代码示例:

Looking at the quick start guide it gives the following code example:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST call CloseableHttpResponse#close() from a finally clause.
// Please note that if response content is not fully consumed the underlying
// connection cannot be safely re-used and will be shut down and discarded
// by the connection manager. 
try {
    System.out.println(response1.getStatusLine());
    HttpEntity entity1 = response1.getEntity();
    // do something useful with the response body
    // and ensure it is fully consumed
    EntityUtils.consume(entity1);
} finally {
    response1.close();
}

上面代码中的两条注释说我们必须为

The two comments in the code above say that we must close the response object for

正确释放系统资源"

如果响应内容没有被完全消耗掉,底层连接就不能安全地重用,连接管理器将关闭并丢弃".

"if response content is not fully consumed the underlying connection cannot be safely re-used and will be shut down and discarded by the connection manager".

现在 Apache 非常友好地为我们实现了 CloseableHttpResponse,这意味着我们可以使用 try-with-resources 块.但是close方法只是关闭了响应对象,为什么不也消费实体呢?

Now Apache have very kindly implementend a CloseableHttpResponse for us, which means we can use a try-with-resources block. But the close method only closes the response object, why doesn't it also consume the entity?

推荐答案

因为此时很难说调用者是否打算重用底层连接.在某些情况下,人们可能只想从大型响应正文中读取一小块内容并立即终止连接.

Because it is hard to say at that point whether or not the caller intends to re-use the underlying connection. In some cases one may want to read just a small chunk from a large response body and immediately terminate the connection.

换句话说,同样的事情一遍又一遍地发生:没有一种方法可以让每个人都开心.

In other words, the same thing happens over and over again: there is no one way that can make everyone happy.

该代码片段将确保正确解除资源分配,同时尝试保持底层连接处于活动状态.

The code snippet will do ensure proper de-allocation of resources while trying to keep the underlying connection alive.

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
try {
    System.out.println(response1.getStatusLine());
} finally {
    EntityUtils.consume(response1.getEntity());
} 

这篇关于为什么 Apache CloseableHttpResponse 在关闭时不使用实体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆