48

httpcomponents httpclientで接続タイムアウトを設定するにはどうすればよいですか?http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.htmlでドキュメントを見つけましたが、これらのパラメーターが実際にどのように設定されているかは明確ではありません。

SO_TIMEOUTまた、との違いの説明CONNECTION_TIMEOUTも参考になります。

4

5 に答える 5

108

Apache Http Clientのバージョン4.3では、構成がリファクタリングされました(再度)。新しい方法は次のようになります。

RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder.setConnectTimeout(timeout);
requestBuilder.setConnectionRequestTimeout(timeout);

HttpClientBuilder builder = HttpClientBuilder.create();     
builder.setDefaultRequestConfig(requestBuilder.build());
HttpClient client = builder.build();
于 2013-11-07T13:12:59.900 に答える
13

HttpClient 4.3バージョンでは、以下の例を使用できます。たとえば、5秒間

int timeout = 5;
RequestConfig config = RequestConfig.custom()
  .setConnectTimeout(timeout * 1000)
  .setConnectionRequestTimeout(timeout * 1000)
  .setSocketTimeout(timeout * 1000).build();
CloseableHttpClient client = 
  HttpClientBuilder.create().setDefaultRequestConfig(config).build();
HttpGet request = new HttpGet("http://localhost:8080/service"); // GET Request
response = client.execute(request);
于 2014-08-19T09:37:32.213 に答える
9

@jontroからの答えは正しいですが、これを行う方法についてのコードスニペットがあると常に便利です。これを行うには2つの方法があります。

バージョン1:これらのパラメーターごとに10秒のタイムアウトを設定します。

HttpClient httpclient = new DefaultHttpClient();
// this one causes a timeout if a connection is established but there is 
// no response within 10 seconds
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10 * 1000);

// this one causes a timeout if no connection is established within 10 seconds
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10 * 1000);

// now do the execute:
HttpGet httpget = new HttpGet(URL);
HttpResponse response = httpclient.execute(httpget);



バージョン2:これらの各パラメーターに10秒のタイムアウトも設定します。

HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 10 * 1000);
HttpConnectionParams.setSoTimeout(params, 10 * 1000);

HttpClient httpclient = new DefaultHttpClient(params);
HttpGet httpget = new HttpGet(URL);
HttpResponse response = httpclient.execute(httpget);
于 2013-01-24T20:34:47.933 に答える
5

セクション2.5では、CONNECTION_TIMEOUTパラメーターを設定する方法の例を示しています。

CONNECTION_TIMEOUTは最初の接続を待機する時間であり、SO_TIMEOUTは、接続が確立された後にパケットを読み取るときに待機するタイムアウトです。

于 2011-05-16T23:09:57.207 に答える
4

問題を回避するために、リクエスト全体にハードタイムアウトを設定しましたjava.net.SocketInputStream.socketRead0

private static final ScheduledExecutorService SCHEDULED_EXECUTOR = Executors.newSingleThreadScheduledExecutor()

HttpGet request = new HttpGet("http://www.example.com")
final Runnable delayedTask = new Runnable() {
    @Override
    public void run() {
        request.abort()
    }
}
SCHEDULED_EXECUTOR.schedule(delayedTask, 100000, TimeUnit.MILLISECONDS)
于 2015-09-05T08:59:20.970 に答える