2012-07-18 16 views
19

Jaka jest domyślna wartość limitu czasu podczas używania Spring's RestTemplate?RestTemplate - domyślna wartość limitu czasu

Na przykład, jestem powołując usługę internetową tak:

RestTemplate restTemplate = new RestTemplate(); 
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class); 

Czy istnieje wbudowaną wartość limitu czasu dla RestTemplate? Nie planuję zmieniać wartości limitu czasu, ale chcę zapewnić rozsądny limit czasu dla każdego żądania.

Dzięki.

Odpowiedz

16

Myślę, że można użyć SimpleClientHttpRequestFactory dla parametru timeout. Instancja SimpleClientHttpRequestFactory może być ustawiona na szablon odpoczynku według metody konstruktora lub ustawiającego.

Domyślnie RestTemplate używa SimpleClientHttpRequestFactory, więc możesz bezpośrednio ustawić wartość dla restTemplate.

+1

dzięki. Sprawdziłem dokumentację SimpleClientHttpRequestFactory i wspomniałem, że "domyślny limit czasu to domyślny limit czasu systemu". Co to znaczy ? –

+1

Sprawdziłem kod źródłowy dla SimpleClientHttpRequestFactory domyślną wartością jest -1 dla limitu czasu odczytu i połączenia. Myślę, że domyślne oznaczało, ponieważ jako HTTP zależy od URLConnection będzie zależeć od jdk dla domyślnego ustawienia limitu czasu –

+0

Domyślny limit czasu dla URLConnection jest nieskończony. Czy to oznacza, że ​​RestTemplate ma również nieskończoną wartość limitu czasu? –

12

Jedną z ładnych cech wiosenno-androidowego RestTemplate jest użycie odpowiedniej (zalecanej przez Google) implementacji RequestFactory w zależności od wersji systemu operacyjnego.

Google zaleca, aby korzystać z udogodnień J2SE na Gingerbread (wersja 2.3) i nowsze, podczas gdy poprzednie wersje powinny używać HttpComponents HttpClient. Na podstawie tej rekomendacji RestTemplate sprawdza wersję Androida, na której działa twoja aplikacja i używa odpowiedniego klientaHttpRequestFactory.

Więc poprzednia odpowiedź nie jest pełna, bo HttpComponentsClientHttpRequestFactory (który jest używany przez wiosenno-android dla Androida wersjach OS < 2.3) nie jest brana pod uwagę.

Moje rozwiązanie było coś takiego:

public class MyRestTemplate extends RestTemplate { 
    public MyRestTemplate() { 
     if (getRequestFactory() instanceof SimpleClientHttpRequestFactory) { 
      Log.d("HTTP", "HttpUrlConnection is used"); 
      ((SimpleClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000); 
      ((SimpleClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000); 
     } else if (getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) { 
      Log.d("HTTP", "HttpClient is used"); 
      ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000); 
      ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000); 
     } 
    } 
} 
+0

Dzięki za kod! Jak ustawić komunikat o przekroczeniu limitu czasu dla pozostałych połączeń?Ponieważ chcę wyświetlić komunikat, gdy żądania przekroczą limit czasu, bez wyniku i błędu po stronie serwera – DroidBee

+1

podczas wykonywania żądania, wychwycenia wyjątku SocketTimeoutException lub czegoś podobnego - i wyświetlenia komunikatu o przekroczeniu limitu czasu. – agamov

+0

Dzięki za komentarz! :) Obsługuję zbyt wiele wywołań reszta, które przeczesuję w interfejsie RestService ** ** przy użyciu adnotacji android. Wszystkie te pozostałe wywołania rzucają wyjątek RestClientException. Ale kiedy dodałem wyjątek IOException pod którym przychodzi SocketTimeoutException, prosi mnie, abym sobie z nim poradził wszędzie tam, gdzie wykonywane są pozostałe połączenia. Czy istnieje sposób, aby poradzić sobie z tym bez dokonywania zmian w każdym zaproszeniu na odpoczynek? Opublikowalem moje pytanie: tutaj: http://stackoverflow.com/q/16542892/1237656 – DroidBee

7

Aby jednoznacznie odpowiedzieć na pytanie ...

Domyślny limit czasu jest nieskończona.

Domyślnie RestTemplate używa SimpleClientHttpRequestFactory, a to z kolei wykorzystuje HttpURLConnection.

Domyślnie limit czasu dla HttpURLConnection wynosi 0 - czyli nieskończony, chyba że zostało ustawione przez tych właściwości:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
+0

Czy istnieje api do sprawdzenia aktualnie ustawionych wartosci? Widzę setters na HttpComponentsClientHttpRequestFactory, aby ustawić wartości, ale nie ma odpowiednich getters do bezpośredniego kwerendy wartości? –