1
votes

Client http par défaut pour le modèle de restauration, valeur absolue pour le délai de lecture

J'ai un problème où une application continue de se bloquer indéfiniment lors d'un appel de publication effectué avec un RestTemplate de Spring Boot.

    Netty4ClientHttpRequestFactory factory = new Netty4ClientHttpRequestFactory();
    factory.setConnectTimeout(timeout);
    factory.setReadTimeout(readTimeout);
    return new RestTemplate(factory);

Nous utilisons l'implémentation JDK standard par défaut et créez-le comme ceci:

    CloseableHttpClient httpClient = HttpClientBuilder.create()
           .setConnectionTimeToLive(1, TimeUnit.SECONDS)
           .setConnectionManager(new PoolingHttpClientConnectionManager())
           .build();

   HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
   clientHttpRequestFactory.setHttpClient(httpClient);
   return new RestTemplate(clientHttpRequestFactory);

Ce qui définit la connexion et le délai de lecture à 5 secondes. Mais il semble que ce ne soit pas une valeur absolue, dès que notre application reçoit des octets, ce délai de lecture se réinitialise et cela fait que notre application attend indéfiniment.

J'ai plutôt un délai de lecture absolu où si vous n'obtenez pas la réponse de fin en moins de 5 secondes, le modèle lance une TimeoutException .

Je n'ai pas trouvé quelque chose comme ça dans les options du client par défaut?

--- EDIT ---

J'ai essayé la réponse @Peekay mais cela ne semble pas fonctionner:

    this.restTemplate = restTemplateBuilder
                       .setConnectTimeout(5000)
                       .setReadTimeout(5000)
                       .build();

J'ai également essayé différentes implémentations du RestTemplate du client, par exemple HttpComponentsClientHttp , Netty4Client et OkHttp3Client les ont créés comme ceci:

ResponseEntity<String> response = restTemplate.postForEntity(destination.getUri(), request, String.class);

Et les ont testés sur une réponse qui a mis plus de 5 secondes à répondre. Tous, à l'exception de Netty, qui a renvoyé une ReadTimeoutException , avait renvoyé 200 succès. Malheureusement, je ne peux pas passer à ce client, il semble que vous deviez l'implémenter vous-même si vous souhaitez continuer à utiliser le client par défaut.


0 commentaires

4 Réponses :


2
votes

Vous avez raison, vous ne pouvez pas définir de valeur absolue et vous devez interrompre la bande de roulement elle-même.


0 commentaires

1
votes

Vous pouvez utiliser d'autres clients http avec RestTemplate, tels que Apache HttpClient qui vous donne plus de contrôle sur comment les connexions sont configurées, regroupées et maintenues:

  • Depuis son HttpClientBuilder , vous pouvez définir une durée de vie de la connexion qui est la durée de vie maximale de la connexion
  • Vous pouvez définir un RequestConfig en spécifiant un délai de connexion (temps maximal d'attente pour qu'une connexion soit établie) et un délai d'expiration de socket distinct (durée maximale pendant laquelle une lecture () attendra des données).

Pour plus de détails, voir: setConnectTimeout contre setConnectionTimeToLive contre setSocketTimeout () < / p>


0 commentaires

1
votes

La façon dont nous avons résolu ce problème était en enveloppant l'appel REST RestTemplate dans un CompletableFuture et en utilisant la fonctionnalité de délai d'expiration de ce wrapper pour tuer le thread si cela prend trop de temps.

Voici un exemple:

CompletableFuture<T> requestWrapper = CompletableFuture.supplyAsync(() -> {
  return restTemplate.postForEntity(/* Whatever arguments you need to pass */);
});

try {
  return requestWrapper.get(5000, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
  requestWrapper.cancel(true);
  throw new TimeoutException("Endpoint took too long to respond, TimeoutException is triggered");
} catch (ExecutionException e) {
  throw e.getCause();
}


0 commentaires

1
votes
-Dsun.net.client.defaultConnectTimeout=<TimeoutInMiliSec>
-Dsun.net.client.defaultReadTimeout=<TimeoutInMiliSec>
https://howtodoinjava.com/spring-boot2/resttemplate/resttemplate-timeout-example/

0 commentaires