Verwenden von Apache HttpClient zum Festlegen des TIMEOUT für eine Anforderung und Antwort

pushya:

Ich muss eine Zeitüberschreitung für die HTTP-Anfrage festlegen, die wir an einen Dienst (nicht an einen Webdienst) richten. Wir verwenden den Apache HTTP Client. Ich habe diese 2 Codezeilen hinzugefügt, um das Zeitlimit auf Anfrage und Antwort auf den Dienst festzulegen.

HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);

1) Derzeit habe ich 10 Sekunden als Zeitlimit festgelegt, da die Antwort vom Dienst fast augenblicklich angezeigt wird. Sollte ich das Timing erhöhen oder verringern?

2) Was passiert, wenn die Antwort länger als 10 Sekunden dauert? Wird es eine Ausnahme auslösen und welche Ausnahme wird es sein? Muss ich noch etwas hinzufügen, um die Zeitüberschreitung im folgenden Code festzulegen?

public HashMap<String, Object> getJSONData(String url) throw Exception{
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(params, 10000);
    HttpConnectionParams.setSoTimeout(params, 10000);
    HttpHost proxy = new HttpHost(getProxy(), getProxyPort());
    ConnRouteParams.setDefaultProxy(params, proxy);
    URI uri;
    InputStream data = null;
    try {
        uri = new URI(url);
        HttpGet method = new HttpGet(uri);
        HttpResponse response = httpClient.execute(method);
        data = response.getEntity().getContent();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    Reader r = new InputStreamReader(data);
    HashMap<String, Object> jsonObj = (HashMap<String, Object>) GenericJSONUtil.fromJson(r);
    return jsonObj;
}
Kevin:

Die Ausnahmen, die Sie sehen werden, sind ConnectTimeoutExceptionund SocketTimeoutException. Die tatsächlich verwendeten Timeout-Werte sollten die maximale Wartezeit Ihrer Anwendung sein. Ein wichtiger Hinweis zum Lesezeitlimit ist, dass es dem Zeitlimit bei einem Socket-Lesevorgang entspricht. Es ist also nicht die Zeit, die für das Eintreffen der vollständigen Antwort vorgesehen ist, sondern die Zeit, die für einen einzelnen Socket-Lesevorgang angegeben wird. Wenn es also 4 Socket-Lesevorgänge gibt, die jeweils 9 Sekunden dauern, beträgt Ihre Gesamtlesezeit 9 * 4 = 36 Sekunden.

Wenn Sie eine Gesamtzeit für das Eintreffen der Antwort angeben möchten (einschließlich Verbindungs- und Gesamtlesezeit), können Sie den Aufruf in einen Thread einbinden und dafür ein Thread-Timeout verwenden. Zum Beispiel mache ich normalerweise so etwas:

Future<T> future = null;
future = pool.submit(new Callable<T>() {
    public T call() {
        return executeImpl(url);
    }   
}); 

try {
    return future.get(10, TimeUnit.SECONDS);
}   
catch (InterruptedException e) {
    log.warn("task interrupted", name);
}   
catch (ExecutionException e) {
    log.error(name + " execution exception", e); 
}   
catch (TimeoutException e) {
    log.debug("future timed out", name);
}

Einige Annahmen, die im obigen Code getroffen wurden, sind: 1) Dies ist in einer Funktion mit einem URL-Parameter, 2) Es ist in einer Klasse mit einer Namensvariablen, 3) Log ist eine log4j-Instanz und 4) Pool ist ein Thread-Pool-Executor . Beachten Sie, dass Sie auch bei Verwendung eines Thread-Zeitlimits ein Zeitlimit für Verbindung und Socket im HttpClient angeben sollten, damit langsame Anforderungen die Ressourcen im Thread-Pool nicht verschlingen. Beachten Sie auch, dass ich einen Thread-Pool verwende, da ich diesen normalerweise in einem Webdienst verwende, sodass der Thread-Pool von mehreren Tomcat-Threads gemeinsam genutzt wird. Ihre Umgebung kann anders sein, und Sie möchten möglicherweise einfach für jeden Aufruf einen neuen Thread erstellen.

Außerdem werden die Zeitüberschreitungen normalerweise über die Mitgliedsfunktionen der Parameter wie folgt festgelegt:

params.setConnectionTimeout(10000);
params.setSoTimeout(10000);

Aber vielleicht funktioniert auch Ihre Syntax (nicht sicher).

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Verwenden von Groovy in ODI zum Festlegen des Abonnenten für eine Datenquelle

Verwenden von Faker zum Abrufen und Festlegen des Geschlechts für alle folgenden Daten

Verwenden von SharedPreferences zum Festlegen des Anmeldestatus und zum Abrufen beim Anrufen der App - Flutter

Verwenden von Async Task zum Lesen der Telefonkontakte und Festlegen eines Adapters für AutoCompleteTextView

Verwenden von DomElement zum Festlegen des Attributs [class] für AMP-HTML

Verwenden des Apache Http-Clients für eine POST-Anforderung

Verwenden von Apache httpclient für https

Verwenden von ParameterizedTypeReference zum Festlegen von ExpectedResponseType für HttpRequestExecutingMessageHandler

Analysieren einer Curl-JSON-Antwort und Verwenden der Antwort zum Erstellen einer weiteren Anforderung

Verwenden des HTML-Tags <time> zum Festlegen von Start- und Enddaten

Verwenden von VBA zum Festlegen von bedingter Formatierung und Hervorhebung

Verwenden von C # und Powershell zum Festlegen von 'Manager' für Postfächer, die auf Exchange Server 2010 erstellt wurden

Festlegen von statement_timeout für eine Rolle in postgres

Verwenden von PHP für eine Klasse zum Erstellen von Dateien und Verzeichnissen

cURL-Anforderung mit HttpClient - Festlegen des Zeitlimits für die Serververbindung (WinInet)

SoundCloud-API: Verwenden von oEmbed zum Festlegen der Start- und Stoppzeit für die Wiedergabe eines Titels

Breite von reCaptcha abrufen und zum Festlegen der Textfeldbreite verwenden?

NumPy zum Festlegen von Indizes für Zeilen und Spalten

Verwenden von vorbereiteten Anweisungen zum Festlegen des Tabellennamens

Verwenden von Excel VBA zum Festlegen des Zahlenformats

SwiftUI - Verwenden von @main zum Festlegen des rootViewController

Verwenden von Redim zum Festlegen des Array-Datentyps

Verwenden von Hooks zum Festlegen des Menüelements className in Reaktion

Verwenden von Hooks zum Festlegen des aktiven Klassennamens

Verwenden von jQuery zum Festlegen des CSS-Attributs

Verwenden von Apache POI zum Schreiben in eine xlsx-Datei, Erwartete Antwort in der letzten Spalte der Datei erhalten

HttpClient und Festlegen von Autorisierungsheadern

Verwenden von querySelectorAll zum dynamischen Ändern des Werts für eine Eingabe

Pandas: Richtige Methode zum Festlegen von Werten basierend auf der Bedingung für eine Teilmenge des Multiindex-Datenrahmens

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv