web-dev-qa-db-ja.com

Apache HttpClient APIのsetConnectionTimeout、setSoTimeoutおよび "http.connection-manager.timeout"の違いは何ですか

3つ(コメントとしてマークされている)の違いは何ですか:

MultiThreadedHttpConnectionManager connManag =  new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams managParams = connManag.getParams();

managParams.setConnectionTimeout(connectiontimeout); // 1
managParams.setSoTimeout(sotimeout); //2

HttpMethodBase baseMethod = null;

try {
  HttpClient client = new HttpClient(connManag);
  client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3

  baseMethod = new GetMethod(…);
  int statusCode = client.executeMethod(…);

  …
}
catch (ConnectTimeoutException cte ){
  //Took too long to connect to remote Host
}
catch (SocketTimeoutException ste){
  //Remote Host didn’t respond in time
}
catch (Exception se){
  //Some other error occurred
}
finally {
  if (baseMethod != null)
    baseMethod.releaseConnection();
}

1. setConnectionTimeout-接続が確立されるまでのタイムアウトを決定する場合。

2. setSoTimeout-非アクティブ期間または2つの連続したパケット間の時間差を特定する場合、

次に、以下のものは何をしますか:

3. "http.connection-manager.timeout"

42
Prateek

最下位レベルのHTTPはTCPソケットです。したがって、URLを要求して応答を取得すると、下位レベルで、リモートサーバーソケットへの接続を確立し、データを送信するクライアントソケットが作成されます応答を受け取ります。

  • setConnectionTimeout:クライアントはサーバーへの接続を試行します。これは、接続が確立されるまで、またはサーバーが接続要求に応答するまでの経過時間を示します。

  • setSoTimeout:接続の確立後、クライアントソケットは要求を送信した後、応答を待ちます。これは、サーバーが応答する前にクライアントがサーバーにリクエストを送信してからの経過時間です。これは、サーバーがクライアントに送信するHTTP Error 408と同じではないことに注意してください。言い換えれば、接続が確立された後にクライアント側に到着する2つの連続したデータパケットの間の最大期間非アクティブです。

  • http.connection-manager.timeoutMultiThreadedHttpConnectionManagerHTTP接続のプールを使用します。ホストごとに最大値と最小値が設定されています。特定のホストのすべての接続が最大値に達した場合、同じホストの新しい接続の要求は、既存の接続のいずれかが解放されるまで待機する必要があります。このパラメーターは、接続要求が行われてからHttpConnectionManagerが接続を返すまでの経過時間を示します。

64
Santosh

このシーケンス図が役立つ場合があります。

Apache http api

23

詳細な説明は、Apache HTTPクライアントサイトの 接続管理ドキュメント で提供されています。

CoreConnectionPNames.SO_TIMEOUT = 'http.socket.timeout':は、ソケットタイムアウト(SO_TIMEOUT)をミリ秒単位で定義します。これは、データ待機のタイムアウトです。別の言い方をすれば、2つの連続したデータパケット間の最大期間非アクティブ)。タイムアウト値ゼロは、無限のタイムアウトとして解釈されます。このパラメーターには、Java.lang.Integer型の値が必要です。このパラメーターが設定されていない場合、読み取り操作はタイムアウトしません(無限タイムアウト)。

CoreConnectionPNames.CONNECTION_TIMEOUT = 'http.connection.timeout':は、接続が確立されるまでのタイムアウトをミリ秒単位で決定します。タイムアウト値ゼロは、無限のタイムアウトとして解釈されます。このパラメーターには、Java.lang.Integer型の値が必要です。このパラメーターが設定されていない場合、接続操作はタイムアウトしません(無限タイムアウト)。

接続マネージャーのタイムアウト(http.connection-manager.timeout)–接続マネージャー/プールからの接続を待機する時間

記録のためだけに

HttpParams httpParams = httpClient.getParams();
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);

別の方法です

HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000);
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000);
7
Aniket Thakur

簡単な言葉で:

  • 接続タイムアウト:アプリケーションがサーバーとの接続を確立しようとして待機できない時間の制限(アドレスが間違っている、サーバーがダウンしているなど)
  • ソケットのタイムアウト:アプリケーションがサーバーに接続された後、応答を待機している時間の制限(遅延は、サーバーのハングなどによって発生する可能性があります)
  • 接続マネージャのタイムアウト:プール内のリクエストのいずれかが解放されるのをキューで待機している場合に、リクエストが待機する時間の制限。つまり、HTTPには最大サイズの接続のプールがあります。アプリケーションに負荷がかかると、プールはいっぱいになる可能性があり、新しいリクエストはプールからの別のリクエストが完了するまで待機する必要があります。
2
user666