まえがき
ApacheのHttpClientを使っていて、httpのコネクション周りでハマった事象のメモ。
当該事象の原因はチームメンバーが見つけてくれたので、僕は「なんやて…??ホンマや!!」って言ってただけなのであしからず。
今後ハマる人が減ることを願ってメモを残しておきます。
前提
'org.apache.httpcomponents:httpclient:4.5.13'
https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient/4.5.13
結論
org.apache.http.impl.client.HttpClientBuilder の setConnectionTimeToLive  メソッドは setConnectionManager メソッドで 自前の HttpClientConnectionManager connManager を設定している場合無視される
事実
connectionManagerをセットしていないときだけsetConnectionTimeToLiveでセットした値を使っている。
HttpClientConnectionManager connManagerCopy = this.connManager;
if (connManagerCopy == null) {
    (略)            
    @SuppressWarnings("resource")  
    final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(  
        RegistryBuilder.<ConnectionSocketFactory>create()  
            .register("http", PlainConnectionSocketFactory.getSocketFactory())  
            .register("https", sslSocketFactoryCopy)  
            .build(),  
 null, null,  dnsResolver,  
  connTimeToLive,  
  connTimeToLiveTimeUnit != null ? connTimeToLiveTimeUnit : TimeUnit.MILLISECONDS);
}
javadocにも書いてある。
Sets maximum time to live for persistent connections
Please note this value can be overridden by the setConnectionManager(HttpClientConnectionManager) method.
google 翻訳nizedすると以下。
持続的接続の最大存続時間を設定します
この値は、setConnectionManager(HttpClientConnectionManager)メソッドによってオーバーライドできることに注意してください。
connectionTimeToLiveを設定したい場合はどうすればいいの?
以下2択と思われる
timeToLiveを設定したconnectionManagerをHttpBuilderに渡すconnectionManagerを設定せず、HttpBuilderにsetConnectionTimeToLiveする
まとめ
- javadocちゃんと読みましょう!(血の涙)
 - ライブラリの実装もちゃんと読みましょう!
 - このブログで助かる人が増えると幸い
 - この仕様は社内のスーパーエンジニャーが見つけてくれました
 
0 件のコメント:
コメントを投稿