让我们考虑HttpComponents的最新(4.2.x)版本之一。
[请说明HttpClient
的实例通常与HttpConnection
的实例(例如ManagedClientConnectionImpl
)以及ClientConnectionManager
有多大关系。谁知道谁?
我将在下面省略[Http]前缀来指代它们。因此,HttpClient
-> Client
我了解Client
始终引用ClientConnectionManager
。这是否意味着Client
也引用了基础Connection
对象?
ConnectionManager
知道所有链接到它的Clients
吗?
HttpClient如何执行HttpGet
的execute
如何了解流,并通过响应的Entity
公开? (之所以这样做,是因为我们可以通过在.abort()
对象上调用HttpGet
来关闭流。)HttpGet
实例是否也链接到Connection
对象?
我很困惑,希望能详细回答以上问题。作为示例,可以使用任何特定的实现方式,例如DefaultHttpClient
,ManagedClientConnectionImpl
,BasicClientConnectionManager
,如果这样可以简化理解的话。
HttpClient
是请求执行管道的外观。执行管道的确切组成取决于HttpClient
实例的配置。可以将其视为具有多个标签的浏览器。
多个HttpClient
实例之一可以依赖于一个ClientConnectionManager
共享基础持久连接池。 ClientConnectionManager
实例不了解依赖于它们的HttpClient
实例。它们只是将连接租借到任何实体请求它们的地方。
每个请求都在特定的HttpContext
中执行。 HttpContext
实例是参与实际HTTP交换执行的所有有状态对象的集合。 HttpContext
实例不是线程安全的,并且不能由多个工作线程共享。
[启动HTTP交换时,HttpClient
从与其关联的ManagedClientConnection
租用了ClientConnectionManager
实例。它序列化请求消息并将其发送到相对的端点,接收响应头,然后将基础连接绑定到响应HttpEntity
实例(如果可用),而无需读取响应内容。这使HttpResponse实例的使用者可以在不进行中间内存缓冲的情况下流响应内容。这也使消费者有必要确保与响应相关的资源(特别是ManagedClientConnection
)的适当释放。