3
votes

504 problème de délai d'expiration de la passerelle dans l'appel Spring Boot Rest pour un enregistrement lourd (plus de 80 Ko)

Je reçois un problème de délai d'expiration de la passerelle 504 Appel Spring Boot Rest à l'aide de l'appel HTTP GET pour un enregistrement lourd (plus de 80 Ko), j'appelle un autre service pour obtenir des données à l'aide de l'objet RestTemplate resClient, code comme ci-dessous:

public ResponseEntity<String> getData(String endPointUrl, Map<String, Object> parameterMap, String smToken) throws Exception {
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.add("Cookie", smToken);
        //headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<Map<String, Object>> entity = new HttpEntity<Map<String, Object>>(parameterMap, headers);
        ResponseEntity<String> responseEntity = null;
        try {
            SSLUtil.turnOffSslChecking();
            LOGGER.info("Start call to end point : " +endPointUrl+ " at :"+ (new Date().toString()) );
            //resClient.getMessageConverters()
            //.add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
            responseEntity = resClient.exchange(endPointUrl, HttpMethod.POST, entity,String.class);
            LOGGER.info("End of call to end point : " +endPointUrl+ " at :"+ (new Date().toString()) );
            LOGGER.debug("Response from end point: " + responseEntity);
        } catch (Exception e) {
            LOGGER.error("Exception while making a http call to " + endPointUrl,e);
            throw e;
        }

        return responseEntity;
    }

Pendant le débogage, je vois une réponse d'un autre appel de service. Cela prend plus de 4 minutes, mais plutôt que d'attendre à ce moment-là pour obtenir la réponse qu'il utilise pour ne sortir qu'après 3 minutes. Comment pouvons-nous faire attendre la réponse d'un autre appel de service?

J'ai essayé de résoudre ce problème en augmentant le délai d'expiration à 5 minutes en utilisant l'attribut server.connection-timeout = 300000 dans application.properties, mais Je reçois une réponse vide. Je ne sais pas si c'est la bonne approche ou non. Veuillez m'aider à résoudre ce problème.


0 commentaires

3 Réponses :


0
votes

Essayez ceci

@Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
    {
        return restTemplateBuilder
           .setConnectTimeout(...)
           .setReadTimeout(...)
           .build();
    }


0 commentaires

2
votes

504 Le problème du délai d'expiration de la passerelle est généralement généré par le serveur proxy, ce qui signifie que le serveur ferme la connexion. Si le client ferme la connexion, vous obtiendrez une erreur Connectiontimeout.


1 commentaires

Bons conseils. Ma configuration haproxy a un délai d'expiration de 125 secondes.



0
votes

server.connection-timeout = #

Temps pendant lequel les connecteurs attendent une autre requête HTTP avant de fermer le connexion. Lorsqu'elle n'est pas définie, la valeur par défaut spécifique au conteneur du connecteur est utilisé.

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws Exception {
        System.setProperty("server.port","8080"));
        System.setProperty("server.connection-timeout","300000");
        System.setProperty("server.tomcat.max-threads","yourValue"); //in-case if you want to chaneg number of thredas 
        SpringApplication.run(Application.class, args);
    }
}

OU Essayez de le définir à partir de l'application

Use a value of -1 to indicate no (that is, an infinite) timeout. (might be bad fix)

Référez-vous également à Ceci


0 commentaires