HttpAsyncClient 4如何工作?

时间:2015-12-29 05:56:08

标签: java apache-httpclient-4.x apache-commons-httpclient apache-httpcomponents apache-httpasyncclient

HttpClient的先前版本中,目标主机已设置为客户端本身。在上一个版本中(对于HttpAsyncClient它是4.1.1),每次我请求时,主机都会设置为HttpRequestHttpGetHttpPost等。

我想使用持久连接,因此我使用HttpAsyncClient。我像这样创建和使用它:

CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
client.start();
List<Future<HttpResponse>> responses = new ArrayList<>();
for (int i = 0; i < 10; i++)
{
    HttpGet get = new HttpGet("https://google.com/");
    responses.add(client.execute(get, null));
}
for (Future<HttpResponse> response : responses) {
    response.get(); //wait for the response
}

正如我测试的那样,它比平常HttpClient工作得更快(如果我做了所有请求,然后等待所有响应)。

但我无法完全理解,它是如何在里面工作的。与https://google.com/建立了多少个连接?如果我将client用于一个主机,然后用于另一个主机,会发生什么? (正如我测试的那样,响应可以按任何顺序排列,所以我认为至少有2个并行连接)。 HttpAsyncClients.createDefault()HttpAsyncClients.createPipelining()之间的区别是什么?

谢谢!

1 个答案:

答案 0 :(得分:4)

默认情况下,HttpAsyncClient每个RFC 2616规范只允许两个并发连接到同一主机。此限制与I / O反应器内部使用的i / o调度线程数无关。

上面的代码最多会创建两个传出连接。

HTTP消息流水线操作与连接持久性本身无关,尽管流水线请求执行意味着使用持久连接。

HTTP流水线是关于消息排序的。流水线操作模式下的HttpAsyncClient可以发送多个请求,而无需等待每个响应。

默认模式:

C -> request1 -> S
C <- response1 <- S
C -> request2 -> S
C <- response2 <- S

流水线模式:

C -> request1 -> S
C -> request2 -> S
C <- response1 <- S
C <- response2 <- S