Wie lege ich das Verbindungszeitlimit in httpcomponents httpclient fest? Ich habe die Dokumentation unter folgender Adresse gefunden: http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html Es ist jedoch nicht klar, wie diese Parameter tatsächlich eingestellt werden.
Auch eine Erklärung des Unterschieds zwischen SO_TIMEOUT
und CONNECTION_TIMEOUT
Wäre hilfreich.
In Version 4.3 von Apache Http Client wurde die Konfiguration (erneut) überarbeitet. Der neue Weg sieht so aus:
RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder.setConnectTimeout(timeout);
requestBuilder.setConnectionRequestTimeout(timeout);
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setDefaultRequestConfig(requestBuilder.build());
HttpClient client = builder.build();
In der HttpClient 4.3-Version können Sie das folgende Beispiel verwenden. Sagen wir für 5 Sekunden
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);
Die Antwort von @jontro ist richtig, aber es ist immer schön, einen Codeausschnitt zu haben, wie man das macht. Hierfür gibt es zwei Möglichkeiten:
Version 1: Legen Sie für jeden dieser Parameter ein Timeout von 10 Sekunden fest:
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);
Version 2: Stellen Sie außerdem für jeden dieser Parameter eine Zeitüberschreitung von 10 Sekunden ein:
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);
In Abschnitt 2.5 sehen Sie ein Beispiel für die Einstellung des Parameters CONNECTION_TIMEOUT.
CONNECTION_TIMEOUT ist die Zeit, die auf die erste Verbindung wartet, und SO_TIMEOUT ist die Zeit, auf die Sie warten, wenn Sie ein Paket lesen, nachdem die Verbindung hergestellt wurde.
Ich habe ein hartes Timeout für die gesamte Anforderung festgelegt, um das Problem Java.net.SocketInputStream.socketRead0
Zu umgehen.
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)