2012-07-18 13 views
19

Qual è il valore di timeout predefinito quando si utilizza RestTemplate di Spring?RestTemplate - valore di timeout predefinito

Per esempio, io sto invocando un servizio web come questo:

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

Esiste un valore di timeout incorporato per RestTemplate? Non ho intenzione di modificare il valore di timeout, tuttavia, voglio assicurarmi che ci sia un timeout ragionevole per ogni richiesta.

Grazie.

risposta

16

Penso che sia possibile utilizzare SimpleClientHttpRequestFactory per il parametro timeout. L'istanza di SimpleClientHttpRequestFactory può essere impostata come modello di riposo per costruttore o metodo setter.

Per impostazione predefinita, RestTemplate utilizza SimpleClientHttpRequestFactory, pertanto è possibile impostare direttamente il valore su restTemplate.

+1

grazie. Ho controllato la documentazione di SimpleClientHttpRequestFactory e accenna che "il timeout predefinito è il timeout predefinito del sistema". Cosa significa ? –

+1

ho guardato il codice sorgente per il valore di default di SimpleClientHttpRequestFactory è -1 per il timeout di lettura e connessione. Penso che per impostazione predefinita intendano come HTTP dipende da URLConnection dipenderà da jdk per l'impostazione di timeout predefinito –

+0

Il timeout predefinito per URLConnection è infinito. Significa che RestTemplate ha anche un valore di timeout infinito? –

12

Una delle belle funzionalità di spring-android RestTemplate è l'uso di un'implementazione appropriata (consigliata da Google) di RequestFactory in base alla versione del sistema operativo.

Google consiglia di utilizzare le strutture J2SE su Gingerbread (versione 2.3) e più recenti, mentre le versioni precedenti dovrebbero utilizzare il HttpComponents HttpClient. Basandosi su questa raccomandazione, RestTemplate controlla la versione di Android su cui è in esecuzione la tua app e utilizza il clientappropriato ClientHttpRequestFactory.

Quindi la risposta precedente non è completo, perché HttpComponentsClientHttpRequestFactory (che viene utilizzato dalla molla-Android per le versioni del sistema operativo Android 2.3 <) non viene presa in considerazione.

La mia soluzione era qualcosa di simile:

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

Grazie per il codice! Come possiamo impostare un messaggio di timeout per le chiamate di resto?Perché voglio visualizzare un messaggio quando le richieste sono scadute senza alcun risultato e nessun errore dal lato server – DroidBee

+1

quando si esegue la richiesta, si cattura SocketTimeoutException, o smth simile - e mostra il tuo messaggio di timeout. – agamov

+0

Grazie per il commento! :) Sto gestendo troppe chiamate di riposo che sto combinando in un'interfaccia di RestService ** ** usando le annotazioni di Android. Tutte le chiamate di resto generano RestClientException. Ma quando ho aggiunto IOException sotto il quale viene SocketTimeoutException, mi sta chiedendo di gestirlo ovunque vengano fatte le chiamate di resto. C'è comunque modo di gestirlo senza apportare cambiamenti in ogni chiamata di riposo? Ho pubblicato il mio Q: qui: http://stackoverflow.com/q/16542892/1237656 – DroidBee

7

Per rispondere in modo esplicito la domanda ...

Il valore predefinito di timeout è infinito.

Per impostazione predefinita, RestTemplate utilizza SimpleClientHttpRequestFactory e, a sua volta, utilizza HttpURLConnection.

Per default il timeout per HttpURLConnection è 0 - cioè infinita, se non è stato impostato queste proprietà:

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

Esiste un'API per interrogare i valori attualmente impostati? Posso vedere i setter su HttpComponentsClientHttpRequestFactory per impostare i valori, ma non ci sono getter corrispondenti a interrogare direttamente i valori? –

Problemi correlati