HttpClient,HttpConnection和ClientConnectionManager之间的关系

问题描述 投票:0回答:1

让我们考虑HttpComponents的最新(4.2.x)版本之一。

[请说明HttpClient的实例通常与HttpConnection的实例(例如ManagedClientConnectionImpl)以及ClientConnectionManager有多大关系。谁知道谁?

我将在下面省略[Http]前缀来指代它们。因此,HttpClient-> Client

我了解Client始终引用ClientConnectionManager。这是否意味着Client也引用了基础Connection对象?

ConnectionManager知道所有链接到它的Clients吗?

HttpClient如何执行HttpGetexecute如何了解流,并通过响应的Entity公开? (之所以这样做,是因为我们可以通过在.abort()对象上调用HttpGet来关闭流。)HttpGet实例是否也链接到Connection对象?

我很困惑,希望能详细回答以上问题。作为示例,可以使用任何特定的实现方式,例如DefaultHttpClientManagedClientConnectionImplBasicClientConnectionManager,如果这样可以简化理解的话。

java apache-httpclient-4.x apache-httpcomponents
1个回答
2
投票

HttpClient是请求执行管道的外观。执行管道的确切组成取决于HttpClient实例的配置。可以将其视为具有多个标签的浏览器。

多个HttpClient实例之一可以依赖于一个ClientConnectionManager共享基础持久连接池。 ClientConnectionManager实例不了解依赖于它们的HttpClient实例。它们只是将连接租借到任何实体请求它们的地方。

每个请求都在特定的HttpContext中执行。 HttpContext实例是参与实际HTTP交换执行的所有有状态对象的集合。 HttpContext实例不是线程安全的,并且不能由多个工作线程共享。

[启动HTTP交换时,HttpClient从与其关联的ManagedClientConnection租用了ClientConnectionManager实例。它序列化请求消息并将其发送到相对的端点,接收响应头,然后将基础连接绑定到响应HttpEntity实例(如果可用),而无需读取响应内容。这使HttpResponse实例的使用者可以在不进行中间内存缓冲的情况下流响应内容。这也使消费者有必要确保与响应相关的资源(特别是ManagedClientConnection)的适当释放。

© www.soinside.com 2019 - 2024. All rights reserved.