webentwicklung-frage-antwort-db.com.de

Apache HttpComponents HttpClient-Zeitüberschreitung

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.

42
Landon Kuhn

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();
95
30thh

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);
10
MAA

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);
9
quux00

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.

5
jontro

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)
2
soulmachine