Chciałbym ustawić limity czasu połączenia dla usługi odpoczynku używanej przez moją aplikację internetową. Używam Spring's RestTemplate do rozmowy z moją usługą. Zrobiłem kilka badań i znalazłem i użyłem XML poniżej (w mojej aplikacji xml), który moim zdaniem ma na celu ustawienie limitu czasu. Używam Spring 3.0.
Widziałem również ten sam problem tutaj Konfiguracja limitu czasu dla sprężynowych usług sieciowych z RestTemplate, ale rozwiązania nie wydają się tak czyste , wolałbym ustawić wartości limitu czasu za pomocą konfiguracji Springa
<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>
Wygląda na to, że niezależnie od ustawienia readTimeout na otrzymuję następujące informacje:
Odłączony kabel sieciowy: czeka około 20 sekund i zgłasza następujący wyjątek:
org.springframework.web.client.ResourceAccessExcepcja: Błąd we / wy: brak trasy do hosta: połącz; zagnieżdżony wyjątek to java.net.NoRouteToHostException: Brak trasy do hosta: connect
Adres URL jest niepoprawny, więc 404 zwrócony przez usługę odpoczynku: czeka około 10 sekund i zgłasza następujący wyjątek:
org.springframework.web.client.HttpClientErrorException: 404 Not Found
Moje wymagania wymagają krótszych limitów czasu, więc muszę mieć możliwość ich zmiany. Jakieś pomysły, co robię źle?
Wielkie dzięki.
źródło
new
stwierdzenie wSpring Boot
przykładzieconnectionRequestTimeout
atrybut nie jest dostępny przed 4.1.4. WYDANIEW końcu udało mi się to.
Myślę, że fakt, że nasz projekt miał dwie różne wersje pliku commons-httpclient jar, nie pomagał. Kiedy to załatwiłem, odkryłem, że możesz zrobić dwie rzeczy ...
W kodzie możesz umieścić:
Pierwsze wywołanie tego kodu spowoduje ustawienie limitu czasu dla
HttpComponentsClientHttpRequestFactory
klasy używanej przezRestTemplate
. Dlatego wszystkie kolejne połączenia wykonywane przez użytkownikaRestTemplate
będą korzystać z ustawień limitu czasu zdefiniowanych powyżej.Lub lepszą opcją jest zrobienie tego:
Gdzie używam
RestOperations
interfejsu w moim kodzie i pobieram wartości limitu czasu z pliku właściwości.źródło
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
To pytanie jest pierwszym linkiem do wyszukiwania Spring Boot, dlatego wspaniale byłoby umieścić tutaj rozwiązanie zalecane w oficjalnej dokumentacji . Spring Boot ma własną wygodną fasolkę RestTemplateBuilder :
Ręczne tworzenie instancji RestTemplate jest potencjalnie kłopotliwym podejściem, ponieważ inne automatycznie skonfigurowane komponenty bean nie są wprowadzane w ręcznie utworzonych instancjach.
źródło
setConnectTimeout
a niektóre implementacjesetReadTimeout
są przestarzałeOto moje 2 centy. Nic nowego, ale kilka wyjaśnień, ulepszeń i nowszy kod.
Domyślnie
RestTemplate
ma nieskończony limit czasu. Istnieją dwa rodzaje limitów czasu: limit czasu połączenia i limit czasu odczytu. Na przykład mogłem połączyć się z serwerem, ale nie mogłem odczytać danych. Aplikacja się zawiesiła i nie masz pojęcia, co się dzieje.Zamierzam użyć adnotacji, które obecnie są preferowane nad XML.
Tutaj używamy
SimpleClientHttpRequestFactory
do ustawiania połączenia i odczytywania limitów czasu. Następnie jest przekazywany do konstruktoraRestTemplate
.W drugim rozwiązaniu używamy
RestTemplateBuilder
. Zwróć także uwagę na parametry dwóch metod: przyjmująDuration
. Przeciążone metody, które zajmują bezpośrednio milisekundy, są teraz przestarzałe.Edycja testowana za pomocą Spring Boot 2.1.0 i Java 11.
źródło
Oto naprawdę prosty sposób na ustawienie limitu czasu:
źródło
Miałem podobny scenariusz, ale musiałem też ustawić proxy. Najprostszym sposobem, w jaki mogłem to zrobić, było rozszerzenie
SimpleClientHttpRequestFactory
dla ułatwienia ustawiania proxy (różne proxy dla non-prod vs prod). To powinno nadal działać, nawet jeśli nie potrzebujesz serwera proxy. Następnie w mojej rozszerzonej klasie nadpisujęopenConnection(URL url, Proxy proxy)
metodę, używając tego samego co źródło , ale tylko ustawiając limity czasu przed powrotem.źródło
Aby rozwinąć odpowiedź benscabbia :
źródło
Zastąp limit czasu za pomocą SimpleClientHttpRequestFactory
HTTPClient zapewnia inne przydatne funkcje, takie jak pula połączeń, zarządzanie bezczynnymi połączeniami itp.
Przeczytaj więcej: Przykład konfiguracji Spring RestTemplate + HttpClient
Zastąp limit czasu za pomocą HttpComponentsClientHttpRequestFactory
Reference: Przykład konfiguracji limitu czasu Spring RestTemplate
źródło