web-dev-qa-db-fra.com

RestTemplate - valeur d'expiration par défaut

Quelle est la valeur de délai d'expiration par défaut lors de l'utilisation de RestTemplate de Spring?

Par exemple, j'invoque un service Web comme celui-ci:

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

Existe-t-il une valeur de délai d'expiration intégrée pour RestTemplate? Je ne prévois pas de modifier la valeur du délai d'attente, cependant, je veux m'assurer qu'il y a un délai raisonnable pour chaque demande.

27
saravana_pc

Je pense que vous pouvez utiliser SimpleClientHttpRequestFactory pour le paramètre timeout. L'instance de SimpleClientHttpRequestFactory peut être définie pour reposer le modèle par le constructeur ou la méthode de définition.

Par défaut, RestTemplate utilise SimpleClientHttpRequestFactory, vous pouvez donc définir directement la valeur sur restTemplate.

19
Jigar Parekh

Pour répondre explicitement à la question ...

Le délai d'expiration par défaut est infini.

Par défaut, RestTemplate utilise SimpleClientHttpRequestFactory et utilise à son tour HttpURLConnection.

Par défaut, le délai d'expiration pour HttpURLConnection est 0 - c'est-à-dire infini, sauf s'il a été défini par ces propriétés:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
16
nevster

L'une des fonctionnalités de Nice de Spring-Android RestTemplate est l'utilisation de l'implémentation appropriée (recommandée par Google) de RequestFactory en fonction de la version du système d'exploitation.

Google recommande d'utiliser les fonctionnalités J2SE sur Gingerbread (version 2.3) et les versions plus récentes, tandis que les versions précédentes devraient utiliser HttpComponents HttpClient. Sur la base de cette recommandation, RestTemplate vérifie la version de Android sur laquelle votre application s'exécute et utilise ClientHttpRequestFactory approprié.

La réponse précédente n'est donc pas complète car HttpComponentsClientHttpRequestFactory (qui est utilisé par spring-Android pour Android OS versions <2.3) n'est pas pris en considération.

Ma solution était quelque chose comme ceci:

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);
        }
    }
}
12
agamov

Vous pouvez utiliser le paramètre ClientHttpRequestFactory dans le constructeur RestTemplate:

private final int HTTP_CONNECT_TIMEOUT = 15000;
private final int HTTP_READ_TIMEOUT = 10000;

private ClientHttpRequestFactory getClientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
    clientHttpRequestFactory.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
    clientHttpRequestFactory.setReadTimeout(HTTP_READ_TIMEOUT);
    return clientHttpRequestFactory;
}

Lorsque vous avez besoin d'un nouveau RestTemplate, créez-le comme cet exemple:

RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());
1
Carlos Cuesta