Este dilema se puede tratar de variadas formas, pero nosotros te compartimos la que en nuestra opinión es la solución más completa.
Solución:
Debe declarar ClientHttpRequestFactory como un bean. Al declararlo como un bean, pasa a ser administrado por la fábrica Spring bean, que llamará al método de destrucción de la fábrica cuando se cierre la aplicación o el bean quede fuera del alcance. El método destroy de ClientHttpRequestFactory cerrará el grupo de conexiones del ClientConnectionManager subyacente. Puede consultar los documentos de Spring API para esto.
@Bean
public ClientHttpRequestFactory createRequestFactory(@Value("$connection.timeout") String maxConn)
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotalConn);
connectionManager.setDefaultMaxPerRoute(maxPerChannel);
RequestConfig config = RequestConfig.custom().setConnectTimeout(100000).build();
CloseableHttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager)
.setDefaultRequestConfig(config).build();
return new HttpComponentsClientHttpRequestFactory(httpClient);
Luego puede usar este bean para crear su RestTemplate:
@Bean
@Qualifier("myRestService")
public RestTemplate createRestTemplate(ClientHttpRequestFactory factory)
RestTemplate restTemplate = new RestTemplate(factory);
restTemplate.setErrorHandler(new RestResponseErrorHandler());
restTemplate.setMessageConverters(createMessageConverters());
return restTemplate;
La pregunta que has hecho:
¿Necesito liberar la conexión después de la llamada anterior o RestTemplate se encarga de ello? Si tenemos que encargarnos de liberar la conexión.
No, no necesita cerrar la conexión en la respuesta, si usa resttemplate.
Desde el httpclient de apache, debe consumir la respuesta completa (EntityUtils.consume(HttpEntity) y cerrar la respuesta.
Esto se puede verificar en ClientConnectionRelease.java
Pero RestTemplate hace esto por usted, para verificar lo mismo, eche un vistazo a RestTemplate.java
buscar método
protected T doExecute(URI url,...)
try
ClientHttpRequest request = this.createRequest(url, method);
...
response = request.execute();
...
if(responseExtractor != null)
var7 = responseExtractor.extractData(response);
return var7;
...
...
finally
if(response != null)
response.close();
Donde el extractor de respuesta hace el trabajo por usted al consumir la respuesta usando
extractorrespuesta.extractData(respuesta);
Y después de extraer los datos por completo, se está cerrando. respuesta.cerrar() también.
Si haces scroll puedes encontrar las interpretaciones de otros gestores de proyectos, tú igualmente puedes dejar el tuyo si te gusta.