RestTemplate + ConnectionPoolTimeoutException: Timeout waiting for connection aus dem pool
Bekam ich diese Fehlermeldung plötzlich in der Produktion, während die Anwendung nicht unter jeder Belastung.
Das Problem passiert, wenn mein code zu senden versucht die SETZEN-Nachricht mit spring rest-Vorlage
Hier ist der code, wie ich bin paraphiernung der restTemplate
private static final RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
{
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(PaymentSession.class);
MarshallingHttpMessageConverter marshallingHttpMessageConverter = new MarshallingHttpMessageConverter(marshaller, marshaller);
marshallingHttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_XML, MediaType.TEXT_HTML));
messageConverters.add(marshallingHttpMessageConverter);
restTemplate.setMessageConverters(messageConverters);
}
Call PUT
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
HttpEntity<PaymentSession> httpEntity = new HttpEntity<PaymentSession>(session, headers);
restTemplate.exchange(baseUrl+"/v1/psps", HttpMethod.PUT, httpEntity, PaymentSession.class);
}catch(HttpClientErrorException e){
logger.error("Exception..!!",e)
}
Exception stacktrace
Caused by: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:232)
at org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:199)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:456)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:88)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:46)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:49)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:509)
InformationsquelleAutor NullPointerException | 2015-07-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Fehler ist selbstbeschreibend. Sie brauchen, um erhöhen Sie Ihre Verbindungs-pool in der Produktion - aktuelle Umsetzung von
HttpComponentsClientHttpRequestFactory
default-Konstruktor mitHttpClientBuilder
mit.useSystemProperties()
.Ich glaube es werden 5 verbindungen standardmäßig. Dies funktioniert für den Kunden aber wahrscheinlich nicht, was Sie wollen in server-Umgebung.
Sie müssen so etwas wie
bitte legen Sie die timeout-Werte auch - kann es sein, dass im Falle des Scheiterns Verbindung dauert mehrere Sekunden, so geht es aus dem pool.
timeout ist bereits nach 30 Sekunden
30 Sekunden ist viel zu viel - 2-3 Sekunden, ist das, was ich mir vorstellen kann - wenn sich die Server in verschiedenen teilen der Erde.
Eine Sache zu berücksichtigen ist, dass es egal ist, wie groß ist der pool, wenn Sie nicht setzen .setMaxConnPerRoute(), die ist glaube ich standardmäßig 4, es wird nur 4 verbindungen zum gleichen host, obwohl Sie vielleicht weitere 196 verbindungen im Leerlauf, ich denke, um zu verhindern, dass ein host von hijacking auf den pool.
InformationsquelleAutor Boris Treukhov
Ich würde vorschlagen, zu konfigurieren
HttpComponentsClientHttpRequestFactory
- Instanz übergeben, die im Konstruktor derRestTemplate
zunehmendedefaultMaxPerRoute
odermaxPerRoute
für die bestimmte http-route, für welche Anforderungen werden timing, steigt die pool-Größe ist nicht genug, wie ich bereits erwähnt in einem Kommentar, auch wenn SiePoolingHttpClientConnectionManager.setMaxTotal()
200HttpComponentsClientHttpRequestFactory
verwendet einedefaultMaxPerRoute
4, meine Vermutung wäre ein Versuch für eine host-route (Schema, host, port) nicht zu entführen connection pool)Anwendung.yml
Ich vor kurzem blog über Fehlerbehebung Spring RestTemplate Anfragen Timeout, wo Anfragen timing waren troubleshooted mit
JMeter
- und shell-Befehle und Feste über die Konfiguration der Einstellungen.InformationsquelleAutor ootero