web-dev-qa-db-ja.com

接続と接続要求のタイムアウト

私はHttp Apache Componentsを使用してhttp対話を実行しています。 httpクライアントを調整する必要があります。この目的のために、接続タイムアウトと接続要求タイムアウトの2つのパラメーターがあります。ライブラリのドキュメントとソースコード(コメントは見つかりませんでした)で、この用語の定義が見つかりませんでした。彼らが正確に何を意味するのかを知る必要があります。 HTTPプロトコルのドキュメントで定義されている可能性がありますが、見つかりません。したがって、私の質問は、この2つの用語の意味と、それらがどのように区別されるかです。

19
mvb13

HttpClientには、接続とソケットのタイムアウト(setConnectionTimeout()およびsetTimeout())を HttpClient javadocs に従って設定する方法があります。

Connection timeoutは、サーバーとの接続が確立されるまでのタイムアウトです。

Socket timeoutは、データを受信するためのタイムアウトです(ソケットタイムアウト)。

例:

たとえば、ブラウザでWebページにアクセスするとします。サーバーがX秒以内に応答しない場合、接続タイムアウトが発生します。ただし、接続を確立すると、サーバーはブラウザーの結果の処理を開始します。この処理がY秒以内に終了しない場合、ソケットタイムアウトが発生します。

24
dgimenes

したがって、私の質問は、[connection-timeoutおよびconnection-request-timeout]の意味と、それらがどのように区別されるかです。

接続タイムアウトは、サーバーが要求を受け入れるまでのミリ秒単位のタイムアウトです。 3000を指定すると、http-clientはサーバーがTCP接続を受け入れるまで3秒待機してからタイムアウトします。これは通常、ネットワークの問題がないことを確認するために使用されます。正しいホスト名またはアドレスに接続していることこれは、curlの--connect-timeout secondsオプションと同等です。

接続要求タイムアウトは入出力タイムアウトです接続が確立されました。この値を10000に指定すると、http-clientがサーバーに接続してリクエストを送信した後、サーバーが結果を返すまで10秒待機します。これは通常、ジョブが遅いサーバーを永遠に待たないようにするために使用されます。これは、curlの--max-time secondsオプションと同等です。

HttpClient 4.X.Xでは、特定のconnectTimeoutMillisおよびrequestTimeoutMillisを使用するクライアントを構築する方法を次に示します。

HttpClientBuilder clientBuilder = HttpClientBuilder.create();
RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder = requestBuilder.setConnectTimeout(connectTimeoutMillis);
requestBuilder = requestBuilder.setConnectionRequestTimeout(requestTimeoutMillis);
clientBuilder.setDefaultRequestConfig(requestBuilder.build());
CloseableHttpClient httpClient = clientBuilder.build();
...

ところで、このコードのjavadocsは最低です。 configビルダーの使用方法を手作業で理解してください。神聖ながらくた。

8
Gray