まえがき
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 件のコメント:
コメントを投稿