7

在以前版本的HttpClient目标主机中设置为客户端本身。在上一个版本(因为它是 4.1.1)中,每次我发出请求时都会HttpAsyncClient将主机设置为HttpRequest(等)。HttpGetHttpPost

我想使用持久连接,所以我使用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()

谢谢!

4

1 回答 1

6

默认情况下,根据 RFC 2616 规范,HttpAsyncClient 只允许到同一主机的两个并发连接。此限制与 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
于 2016-01-04T13:52:30.850 回答