java - HttpAsyncClient 4 如何工作?

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

HttpClient 的早期版本中,目标主机被设置为客户端本身。在上一个版本中(对于 HttpAsyncClient,它是 4.1.1)主机被设置为 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() 有什么区别?

谢谢!

最佳答案

默认情况下,根据 RFC 2616 规范,HttpAsyncClient 仅允许两个并发连接到同一主机。此限制与 i/o react 器内部使用的 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

关于java - HttpAsyncClient 4 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505271/

相关文章:

android - import cz.msebera.android.httpclient.conn.ssl.SSLSocketFactory无法解析

java - "cURL -u"使用 Apache HTTPClient 的 API key 授权

java - 使用 Java HttpClient 发送带有 443 用户 ID 密码提示身份验证的 GET 请求

java - Thymeleaf 多文件输入在未选择任何内容时发送空文件

java - 贪吃蛇游戏 : How to deal with a interrupt thread and with a deadlock

java - Spark 获取嵌套 json 的列名

java - 防止第 3 方警告使日志文件困惑

java - Apache HttpClient - ConnectionTimeout 和 SoTimeout

testing - 如何测试 Apache HttpClient RequestConfig 值是否设置正确?没有公共(public) setter/getter 存在

java - Android:BasicClientCookie/CookieStore 在 cookie 值周围添加引号