JAva httpClientデフォルトの構成では、ラインオフプールがいっぱいになっているため、大きな穴ができています.


詳細
最近、システムがサードパーティ製システムを呼び出すと、深刻なエラーが発生しました.システムの30分以内のエラー率timeoutが高くなります.
 
##背景
プロジェクトはClonableHttpClientを使用してサードパーティhttpClient v 4.5.3を呼び出し、使用時にconnectTimeout、SocketTimeoutだけを呼び出した.サードパーティのシステムは故障でサーバーの応答が遅くなり、その間に多くのReadTimeoutが現れ、8分間続いて回復したが、私たちのシステムは当時ちょうどビジネスのピークにあり、フロントエンドに大量のReadTimeoutが現れた.40分近く続いた.お客様の要件調査の理由
 
##  分析プロセス
-システムがオンラインになってから2年が経ちましたが、大きな問題はありませんでした.このようなシーンの前にも遭遇しました.再起動しました.
-今回はROOT CAUSEを調べるように要求した.主にhttpClientの設定を疑っています.システムが使用するコードは以下の通りです.
```
    CloseableHttpClient httpClient = context.getBean(CloseableHttpClient.class);
RequestConfig.Builder builder = RequestConfig.custom();
    builder.setAuthenticationEnabled(true);
    builder.setConnectTimeout(timeout);
    builder.setSocketTimeout(timeout);
    StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8"));
HttpPost post = new HttpPost(address);
    post.setConfig(builder.build());
    post.setHeader("Content-type", "application/json; charset=utf-8");
    post.setEntity(stringEntity);
    HttpEntity httpEntity = httpClient.execute(post).getEntity();

```
 
基本的にはデフォルトの構成で、行きたいと思っていましたが、最後にサードパーティのシステムが故障している間に、大量のリクエストが積み上げられ、列に並んでいたはずだと思います.サードパーティのシステムが回復しても、入隊のリクエストは一つ一つ消費しなければなりません.
リファレンス https://gaozzsoft.iteye.com/blog/2352241 
httpClientのデフォルトにはスレッドプールがあり、デフォルトの同時スレッドプールは5で、もう1つの構成があります. setConnectionRequestTimeoutは、構成なしでキューに並ぶリクエストが無限に待機します. setConnectionRequestTimeoutでは、使用可能なスレッドプールを待機する最大待機時間を設定できます.私たちは自分でコードでこの論理を検証し、公式の説明を見ていません.
 
設定後、タイムアウトするとエラーが返されます
```
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
```