CloseableHttpClient使用了连接池,业务上遇到了org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool异常,这里显示连接池大小不够了。当时并发并不是很高,为什么遇到这个问题呢?
后来发现接口使用了gzip压缩,如果对方关闭了gzip就没有问题。这里展示一个简单的例子:
这个例子循环请求接口,前2次OK,第3次就不行了。查看连接池的默认配置,defaultMaxPerRoute=2,刚好是连接池不够用。
@Test
public void failureReuseTest() throws IOException {
//超时配置
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(1000)
.setConnectTimeout(1000)
.setConnectionRequestTimeout(3000)
.build();
for (int i = 1; i <= 10; i++) {
HttpUriRequest request = RequestBuilder.create("GET")
.setConfig(config)
.setUri(DAP_URL + "?i=" + i).build();
CloseableHttpResponse httpResponse = HTTP_CLIENT.execute(request);