web-dev-qa-db-fra.com

Modèle de repos de ressort readTimeOut

J'essaie de comprendre le readTimeout disponible sur restTemplate, qu'est-ce que c'est exactement?

S'agit-il du temps total que la demande peut prendre avant que nous obtenions l'exception de délai d'attente?

7
Seb

Vous pouvez définir un délai de lecture sur un RestTemplate comme suit:

HttpComponentsClientHttpRequestFactory clientRequestFactory = new HttpComponentsClientHttpRequestFactory();
// set the read timeout, this value is in milliseconds
clientRequestFactory.setReadTimeout(500);

RestTemplate restTemplate = new RestTemplate(clientRequestFactory);

Étant donné un readTimeout de X millis, toute demande effectuée via cette instance RestTemplate qui prend plus de temps que X millis se traduira par un ResourceAccessException, enveloppant un Java.net.SocketTimeoutException avec le message d'exception: "Read timed out".

Le délai d'expiration est en fait implémenté par le connecteur de socket à l'intérieur de l'instance HttpClient qui est enveloppée par le RestTemplate de sorte que l'horloge démarre lorsque la requête atteint ce socket pour la première fois et s'arrête lorsque celui-ci vient en premier: le la demande se termine ou le readTimeout est atteint.

En effet, cela signifie que toute demande qui prend plus de temps que le readTimeout configuré échouera avec une exception de délai d'expiration.

12
glytching

Pour autant que je sache, dans restTemplate nous avons 3 types de timeouts

  1. ConnectionRequestTimeout. C'est le délai d'attente en millisecondes pour obtenir la connexion à partir de connectionManager

  2. ConnectionTimeout. C'est le délai d'attente en millis pour établir la connexion entre la source et la destination

  3. ReadTimeout. Il s'agit du délai d'expiration en millis qui s'attend à ce que la réponse/le résultat soit renvoyé du point de terminaison de destination.

26
Dhana

Vous pouvez également définir un bean:

@Bean
public RestTemplate restTemplateReadTimeout(RestTemplateBuilder builder) {
    return builder
            .setReadTimeout(15000) //15 seconds
            .build();
}

Et utilisez-le:

@Autowired
@Qualifier("restTemplateReadTimeout")
private RestTemplate restTemplate;

PS .: Quand j'ai utilisé cette configuration sur Spring Boot, j'ai essayé de créer différents RestTemplate Beans avec différentes configurations de timeout. Mais j'ai fini par voir Spring utiliser toujours une seule configuration de timeout (probablement en utilisant le timeout du dernier bean enregistré), agissant comme la configuration de timeout était un Singleton parmi les RestTemplates. Faites donc attention à cela, je ne sais pas s'il y a eu une erreur dans ma configuration, un bug ou un comportement attendu.

8
Dherik