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?
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.
Pour autant que je sache, dans restTemplate nous avons 3 types de timeouts
ConnectionRequestTimeout. C'est le délai d'attente en millisecondes pour obtenir la connexion à partir de connectionManager
ConnectionTimeout. C'est le délai d'attente en millis pour établir la connexion entre la source et la destination
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.
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.