从https://github.com/square/okhttp/issues/6051移动
这是okhttp keepalived连接的问题,我想知道如何处理此问题。
OkHttpClient httpClient = new OkHttpClient.Builder()
.sslSocketFactory(factory, (X509TrustManager) TRUST_MANAGERS[0])
.hostnameVerifier((s, sslSession) -> true)
.protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
.retryOnConnectionFailure(true)
.connectionPool(new ConnectionPool(5, 60, TimeUnit.SECONDS))
.build();
Request request = new Request.Builder()
.url("https://example.com/")
.build();
int count = 2;
long startTime = System.currentTimeMillis();
final CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i = 1; i <= count; ++i) {
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println(Thread.currentThread().getName() + "-failed-" + e.getMessage());
finish();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
finish();
}
private void finish() {
countDownLatch.countDown();
}
});
}
countDownLatch.await();
System.out.println("Time: " + (System.currentTimeMillis() - startTime) );
System.exit(0);
}
如果想了解发生了什么,请使用LoggingEventListener。
[通常,当我们第一次连接时,我们无法提前知道单个连接将是http / 2并且能够满足这两个请求。因此,当连接池为空时,OkHttp将建立2个连接,发现它们都是http / 2,然后断开其中之一。
很可能两个请求都使用一个连接,但是您看到两个建立的连接。
您有几个选择
1)不用担心,让它临时创建两个连接,并且OkHttp一旦意识到它具有两个HTTP / 2连接,就会关闭一个连接。
2)使用热身请求创建第一个请求,然后仅在收到第一个请求的connectionAcquired事件后,才向同一主机创建辅助请求。
但是我鼓励您不要担心,只要让OkHttp来完成就可以了。