2014-01-20 49 views
16

Apache HttpClient 4.3バージョンで接続アイドルタイムアウトを設定する最短の方法は何ですか?Apache HttpClient 4.3 - 接続アイドルタイムアウトを設定する

ドキュメントを調べたところ、何も見つかりませんでした。私の目標は、開いている接続を最小のポストサーバーピークまで減らすことです。

桟橋クライアント8.xで、たとえば、あなたはhttpClient.setIdleTimeoutを設定することができます。HttpClientBuilderが呼び出されたときにデフォルト値を設定することができるようにhttp://download.eclipse.org/jetty/stable-8/apidocs/org/eclipse/jetty/client/HttpClient.html#setIdleTimeout(long)

答えて

29

タイムアウトはRequestConfigに設定されています。例えば

あなたはこのような何かを行うことができ、あなたのタイムアウト変数は、カスタムRequestConfigを作成するために、数秒であると仮定すると:

RequestConfig config = RequestConfig.custom() 
    .setSocketTimeout(timeout * 1000) 
    .setConnectTimeout(timeout * 1000) 
    .build(); 

あなたは、このようにデフォルトRequestConfigを設定あなたのHttpClientを構築することができ:

HttpClients.custom() 
    .setDefaultRequestConfig(config); 
+1

これは私が探しているものではありません。上記はreadTimeoutとconnectTimeoutです。私は開かれた接続について「退去」ポリシーを設定する方法を見つけようとしています。アドレスあたり1000件の接続に達するピークを考えてみましょう。 X秒後にApacheクライアントにアイドル状態の接続をクローズするように指示する方法を教えてください。 – YaOg

+0

HttpClientを構築してConnectionKeepAliveStrategyインターフェイスを実装するときは、setKeepAliveStrategy()を見てください。これは、接続が再利用される前にアイドル状態になるまでの時間をクライアントに通知します。 – Brett

+1

この回答は間違っています。 setConnectTimeoutは、サーバーに接続するためのタイムアウトを設定します。 setSocketTimeoutは、読み取り操作中のタイムアウトを設定します。 OPは、アイドルタイムアウトについて質問していました。 –

8

できません。は、Apache HTTP Clientの設定でアイドル接続タイムアウトを設定できません。理由は、そうすることでパフォーマンスのオーバーヘッドがあるからです。

文書には、理由と理由が明記されており、コピー可能なアイドル状態の接続モニター実装の例が示されています。基本的にこれはあなたが定期的に古典的なブロックI/Oモデルの主な欠点のhttp://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

一つ

HttpClientConnectionManagercloseIdleConnectionsを呼び出すために実行することを別のスレッドでのネットワークソケットがI/Oイベントに反応することができるということですI/O操作でブロックされた場合に限ります。接続がマネージャに戻されると、接続は維持されますが、ソケットの状態を監視したり、I/Oイベントに反応することはできません。サーバー側で接続が閉じられた場合、クライアント側の接続は接続状態の変更を検出できません(また、最後にソケットを閉じることによって適切に反応します)。 HttpClientは、HTTP要求の実行に接続を使用する前に、接続が「無効」であるかどうか、つまりサーバー側で閉じられているため有効ではなくなったかどうかをテストして問題を緩和しようとします。失効した接続チェックは100%信頼できるものではなく、各要求の実行に10〜30ミリ秒のオーバーヘッドを追加します。アイドル接続のソケットモデルごとに1つのスレッドを伴わない唯一の実行可能なソリューションは、長期間の非活動のために期限切れとみなされる接続を退去させる専用のモニタスレッドです。モニタスレッドは定期的にClientConnectionManager#closeExpiredConnections()メソッドを呼び出して、期限切れの接続をすべて終了し、閉じられた接続をプールから退去させることができます。 ClientConnectionManager#closeIdleConnections()メソッドを任意に呼び出して、指定された期間にわたってアイドル状態になっていたすべての接続を閉じることもできます。

関連する問題