Apache HttpClient:第一次调用很慢,后面的调用很快
Apache HttpClient: first call very slow, following calls very fast
我一直在使用 Apache HttpClient 4.5.13,直到今天我都没有遇到任何问题。
在 Springboot 应用程序中调用特定服务器时,第一次调用(或在一些不活动后的第一次调用)需要大约 8 秒(!!!)然后所有后续调用(对同一服务器)非常快(不到一秒)。
(使用 curl 的同一个调用总是需要不到一秒钟的时间)
如果我等待一些时间(例如,一个小时)并重试,第一次调用再次需要 8 秒,以下非常快。
第一次通话慢是什么原因?
我使用这个客户端很多年了,从来没有遇到过这个问题。
一段代码:
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(Integer.parseInt(env.getProperty("httpclient.connection.timeout")))
.setConnectionRequestTimeout(Integer.parseInt(env.getProperty("httpclient.connection.request.timeout")))
.setSocketTimeout(Integer.parseInt(env.getProperty("httpclient.socket.timeout")))
.setCookieSpec("easy")
.build();
result = HttpClients.custom().setSSLContext(sslContext)
.setSSLHostnameVerifier(getHostnameVerifier())
.setConnectionManager(poolingConnManager)
.setDefaultRequestConfig(requestConfig)
.setDefaultSocketConfig(socketConfig)
.setDefaultCookieSpecRegistry(r)
.addInterceptorFirst(customHttpRequestInterceptor)
.addInterceptorLast(customHttpResponseInterceptor)
.build();
我也启用了 Http 调试,但我没有看到任何异常,服务器响应在 8 秒后到达:
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "POST /service/url1 HTTP/1.1[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Authorization: Bearer eyJjdHkiOiJKV1QiLCJyZWFsb[...][\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "X-Tax-Code: AAAAAAAAAAAAAAA01[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Content-type: application/json[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "accept: application/json[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Content-Length: 25[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Host: serverhost[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Connection: Keep-Alive[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "User-Agent: Apache-HttpClient/4.5.13 (Java/1.8.0_252)[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Accept-Encoding: gzip,deflate[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "{"product_name":"XXXXXXX"}"
**Server response arrives after 8 seconds here**
[2022-01-22 17:11:48][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 << "HTTP/1.1 200 [\r][\n]"
更新:我使用 OkHttpClient 重写了客户端,但我收到了同样的慢速调用,所以我认为它不依赖于客户端。
几天后,我终于得到了与 curl 相同的缓慢响应。
所以这是一个服务器端问题。
我一直在使用 Apache HttpClient 4.5.13,直到今天我都没有遇到任何问题。
在 Springboot 应用程序中调用特定服务器时,第一次调用(或在一些不活动后的第一次调用)需要大约 8 秒(!!!)然后所有后续调用(对同一服务器)非常快(不到一秒)。 (使用 curl 的同一个调用总是需要不到一秒钟的时间) 如果我等待一些时间(例如,一个小时)并重试,第一次调用再次需要 8 秒,以下非常快。
第一次通话慢是什么原因? 我使用这个客户端很多年了,从来没有遇到过这个问题。 一段代码:
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(Integer.parseInt(env.getProperty("httpclient.connection.timeout")))
.setConnectionRequestTimeout(Integer.parseInt(env.getProperty("httpclient.connection.request.timeout")))
.setSocketTimeout(Integer.parseInt(env.getProperty("httpclient.socket.timeout")))
.setCookieSpec("easy")
.build();
result = HttpClients.custom().setSSLContext(sslContext)
.setSSLHostnameVerifier(getHostnameVerifier())
.setConnectionManager(poolingConnManager)
.setDefaultRequestConfig(requestConfig)
.setDefaultSocketConfig(socketConfig)
.setDefaultCookieSpecRegistry(r)
.addInterceptorFirst(customHttpRequestInterceptor)
.addInterceptorLast(customHttpResponseInterceptor)
.build();
我也启用了 Http 调试,但我没有看到任何异常,服务器响应在 8 秒后到达:
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "POST /service/url1 HTTP/1.1[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Authorization: Bearer eyJjdHkiOiJKV1QiLCJyZWFsb[...][\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "X-Tax-Code: AAAAAAAAAAAAAAA01[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Content-type: application/json[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "accept: application/json[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Content-Length: 25[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Host: serverhost[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Connection: Keep-Alive[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "User-Agent: Apache-HttpClient/4.5.13 (Java/1.8.0_252)[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "Accept-Encoding: gzip,deflate[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "[\r][\n]"
[2022-01-22 17:11:40][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 >> "{"product_name":"XXXXXXX"}"
**Server response arrives after 8 seconds here**
[2022-01-22 17:11:48][][][][][pool-6-thread-3][DEBUG]org.apache.http.wire - http-outgoing-3 << "HTTP/1.1 200 [\r][\n]"
更新:我使用 OkHttpClient 重写了客户端,但我收到了同样的慢速调用,所以我认为它不依赖于客户端。
几天后,我终于得到了与 curl 相同的缓慢响应。
所以这是一个服务器端问题。