報錯現象
線上項目使用HttpClient請求第三方的HTTP資源,並發量高的時候,日志框報Timeout waiting for connection from pool
客戶端的現象是有時正常,有時報錯
原因分析
網上查找資料,很多照搬某個博客的解決方法,大致是合理的使用EntityUtils.consume及時釋放請求連接
這個說法沒錯,但是這里的問題不是請求連接釋放不當導致的
出現這個異常是因為新的請求來的時候,需要到HttpClient的線程池里面獲取一個連接,作為請求連接
當請求等待獲取連接的時間超過設置的connectionRequestTimeout,就會拋出Timeout waiting for connection from pool異常
解決方法
1. 合理的配置HttpClient的連接池大小
clientBuilder.setMaxConnTotal(maxConnections);
2. 結合業務現狀配置連接超時時間
RequestConfig.custom().
setConnectTimeout(connectTimeout).
setSocketTimeout(readTimeout).
.setConnectionRequestTimeout(connectionRequestTimeout).build();