es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Liberar la conexión de Rest Template del pool.

Tengo una configuración similar a la siguiente para mi RestTemplate. Estoy intentando liberar una conexión del pool si obtengo un código de estado que no sea 2XX (es una larga historia, pero necesito este código). ¿Existe alguna manera de obtener el gestor de conexiones y liberar una conexión específica?

@Bean
public RestTemplate restTemplate() {
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    connectionManager.setMaxTotal(100);
    connectionManager.setDefaultMaxPerRoute(20);

    RequestConfig requestConfig = RequestConfig
        .custom()
        .setConnectionRequestTimeout(5000) // tiempo de espera para obtener conexión del pool
        .setSocketTimeout(5000) // tiempo de espera de conexión estándar
        .setConnectTimeout(5000) // tiempo de espera de conexión estándar
        .build();

    HttpClient httpClient = HttpClientBuilder.create()
                                             .setConnectionManager(connectionManager)
                                             .setDefaultRequestConfig(requestConfig).build();

    ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

    return new RestTemplate(requestFactory);
}

Buscando una manera de lograr algo similar a lo siguiente:

if(!httpStatusCode.substr(1).equals("2")) {
  restTemplate.getConnectionPool().release().thisConnection();
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes liberar una conexión específica del grupo de conexiones utilizando la instancia PoolingHttpClientConnectionManager. Puedes obtener el administrador de conexiones desde la instancia de HttpClient y luego llamar a su método releaseConnection() para liberar una conexión específica. Aquí tienes un ejemplo:

    if (!httpStatusCode.startsWith("2")) {
        HttpClient httpClient = restTemplate.getRequestFactory().getHttpClient();
        if (httpClient instanceof CloseableHttpClient) {
            PoolingHttpClientConnectionManager connectionManager = (PoolingHttpClientConnectionManager) ((CloseableHttpClient) httpClient).getConnectionManager();
            HttpRoute route = new HttpRoute(new HttpHost("tu_host_aqui", 80));
            ConnectionRequest connRequest = connectionManager.requestConnection(route, null);
            HttpClientConnection conn = connRequest.get(5, TimeUnit.SECONDS);
            try {
                // Utiliza `conn` para realizar cualquier operación adicional en la conexión, si es necesario
            } finally {
                connectionManager.releaseConnection(conn, -1, TimeUnit.MILLISECONDS);
            }
        }
    }
    

    Ten en cuenta que deberás reemplazar "tu_host_aqui" con el host real al que te estás conectando. Además, asegúrate de manejar adecuadamente cualquier excepción que pueda ocurrir durante el proceso de creación y liberación de la conexión.

Comments are closed.