Httpcomponents httpclientで接続タイムアウトを設定するにはどうすればよいですか?私は次の場所にドキュメントを見つけました: http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html .
また、SO_TIMEOUT
とCONNECTION_TIMEOUT
の違いの説明も役立ちます。
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();
HttpClient 4.3バージョンでは、以下の例を使用できます。
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);
@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);
セクション2.5 には、CONNECTION_TIMEOUTパラメーターの設定方法の例があります。
CONNECTION_TIMEOUTは初期接続を待機する時間であり、SO_TIMEOUTは接続が確立された後にパケットを読み取るときに待機するタイムアウトです。
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)