Ich möchte die Verbindungszeitüberschreitungen für einen von meiner Webanwendung verwendeten Restdienst festlegen. Ich verwende Spring's RestTemplate, um mit meinem Dienst zu sprechen. Ich habe einige Nachforschungen angestellt und die folgende XML-Datei (in meiner Anwendungs-XML-Datei) gefunden und verwendet, von der ich glaube, dass sie das Zeitlimit festlegen soll. Ich benutze Spring 3.0.
Ich habe hier auch das gleiche Problem gesehen. Timeout-Konfiguration für Spring-Webservices mit RestTemplate, aber die Lösungen scheinen nicht so sauber zu sein . Ich würde es vorziehen, die Timeout-Werte über die Spring-Konfiguration festzulegen
<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
<bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
<property name="readTimeout" value="${restURL.connectionTimeout}" />
</bean>
</constructor-arg>
</bean>
Wie auch immer ich das readTimeout einstelle, ich erhalte Folgendes:
Netzwerkkabel getrennt: Wartet ca. 20 Sekunden und meldet folgende Ausnahme:
org.springframework.web.client.ResourceAccessExcep tion: E / A-Fehler: Keine Route zum Host: connect; verschachtelte Ausnahme ist java.net.NoRouteToHostException: Keine Route zum Host: Verbindung
URL falsch, so dass 404 vom Restdienst zurückgegeben wird: Wartet ca. 10 Sekunden und meldet folgende Ausnahme:
org.springframework.web.client.HttpClientErrorException: 404 Nicht gefunden
Meine Anforderungen erfordern kürzere Zeitüberschreitungen, daher muss ich diese ändern können. Irgendwelche Ideen, was ich falsch mache?
Danke vielmals.
quelle
new
Aussage imSpring Boot
BeispielconnectionRequestTimeout
Attribut nicht vor dem 4.1.4.FREIGABE verfügbar istIch habe es endlich geschafft.
Ich denke, die Tatsache, dass unser Projekt zwei verschiedene Versionen des Commons-httpclient-JARs hatte, hat nicht geholfen. Nachdem ich das geklärt hatte, stellte ich fest, dass Sie zwei Dinge tun können ...
Im Code können Sie Folgendes eingeben:
Wenn dieser Code zum ersten Mal aufgerufen wird, wird das Zeitlimit für die
HttpComponentsClientHttpRequestFactory
von der Klasse verwendete Klasse festgelegtRestTemplate
. Daher verwenden alle nachfolgenden Anrufe vonRestTemplate
die oben definierten Timeout-Einstellungen.Oder die bessere Option ist dies:
Wo ich die
RestOperations
Schnittstelle in meinem Code verwende und die Timeout-Werte aus einer Eigenschaftendatei erhalte.quelle
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Diese Frage ist der erste Link für eine Spring Boot-Suche. Daher wäre es großartig, hier die in der offiziellen Dokumentation empfohlene Lösung anzugeben . Spring Boot verfügt über eine eigene Convenience-Bean RestTemplateBuilder :
Die manuelle Erstellung von RestTemplate-Instanzen ist ein potenziell problematischer Ansatz, da andere automatisch konfigurierte Beans nicht in manuell erstellte Instanzen eingefügt werden.
quelle
setConnectTimeout
und einige Implementierungen vonsetReadTimeout
sind veraltetHier sind meine 2 Cent. Nichts Neues, aber einige Erklärungen, Verbesserungen und neuerer Code.
Standardmäßig
RestTemplate
ist das Zeitlimit unbegrenzt. Es gibt zwei Arten von Zeitüberschreitungen: Verbindungszeitüberschreitung und Lesezeitüberschreitung. Zum Beispiel konnte ich eine Verbindung zum Server herstellen, aber keine Daten lesen. Die Anwendung hing und Sie haben keine Ahnung, was los ist.Ich werde Anmerkungen verwenden, die heutzutage XML vorgezogen werden.
Hier stellen wir
SimpleClientHttpRequestFactory
die Verbindung ein und lesen Timeouts. Es wird dann an den Konstruktor von übergebenRestTemplate
.In der zweiten Lösung verwenden wir die
RestTemplateBuilder
. Beachten Sie auch die Parameter der beiden Methoden: Sie nehmenDuration
. Die überladenen Methoden, die direkt Millisekunden dauern, sind jetzt veraltet.Bearbeiten Getestet mit Spring Boot 2.1.0 und Java 11.
quelle
Hier ist eine wirklich einfache Möglichkeit, das Timeout festzulegen:
quelle
Ich hatte ein ähnliches Szenario, musste aber auch einen Proxy festlegen. Der einfachste Weg, dies zu tun, bestand darin, das zu erweitern,
SimpleClientHttpRequestFactory
um das Einstellen des Proxys zu vereinfachen (verschiedene Proxys für Nicht-Prod gegen Prod). Dies sollte auch dann funktionieren, wenn Sie den Proxy nicht benötigen. Dann überschreibe ich in meiner erweiterten Klasse dieopenConnection(URL url, Proxy proxy)
Methode, indem ich dieselbe wie die Quelle verwende , aber nur die Zeitüberschreitungen festlege, bevor ich zurückkehre.quelle
Um die Antwort von benscabbia zu erweitern :
quelle
Zeitüberschreitung mit SimpleClientHttpRequestFactory überschreiben
HTTPClient bietet weitere nützliche Funktionen wie Verbindungspool, Verwaltung von Leerlaufverbindungen usw.
Lesen Sie mehr: Konfigurationsbeispiel für Spring RestTemplate + HttpClient
Zeitüberschreitung mit HttpComponentsClientHttpRequestFactory überschreiben
Referenz: Beispiel für eine Konfiguration des Spring RestTemplate-Timeouts
quelle