Saltar al contenido

Spring RestTemplate – ¿Necesita liberar la conexión?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *