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.
3 Réponses :
Essayez ceci
@Bean public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder .setConnectTimeout(...) .setReadTimeout(...) .build(); }
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.
Bons conseils. Ma configuration haproxy a un délai d'expiration de 125 secondes.
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