3

I am using RestTemplate with ConnectionPooling using PoolingHttpClientConnectionManager as in below code :

PoolingHttpClientConnectionManager connectionManager = new 
PoolingHttpClientConnectionManager();
    connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);
    
connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);
    connectionManager.setMaxPerRoute(new HttpRoute(new 
HttpHost(excConfig.getImsServerEndpoint())), IMS_ROUTE_MAX_CONNECTIONS);

    CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(connectionManager).build();

    HttpComponentsClientHttpRequestFactory httpReqFactory = new HttpComponentsClientHttpRequestFactory(httpclient);
    httpReqFactory.setReadTimeout(DEFAULT_HTTP_TIMEOUT_MILLISECONDS);
    httpReqFactory.setConnectionRequestTimeout(DEFAULT_HTTP_TIMEOUT_MILLISECONDS);
    httpReqFactory.setConnectTimeout(DEFAULT_HTTP_TIMEOUT_MILLISECONDS);

    restTemplate = new RestTemplate(httpReqFactory);

Does RestTemplate take care of terminating stale connections by itself? Or do I need to put in some specific handling for the same?

Peter Wippermann
  • 4,125
  • 5
  • 35
  • 48
piyugupt
  • 404
  • 2
  • 5
  • 14

2 Answers2

2

By default it does not, but you can configure it easily in your CloseableHttpClient configuration.

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultRequestConfig(RequestConfig.custom().setStaleConnectionCheckEnabled(true))
    .setConnectionManager(connectionManager)
    .build();`

Source here.

Subaru Tashiro
  • 2,166
  • 1
  • 14
  • 29
iamharish15
  • 1,760
  • 1
  • 17
  • 20
2

setStaleConnectionCheckEnabled has become obsolete.

HttpClients.custom() .setDefaultRequestConfig(RequestConfig.custom().setStaleConnectionCheckEnabled(true)) .setConnectionManager(connectionManager) .build();

In HttpClient 4.5.3 the below code works -

PoolingHttpClientConnectionManager connManager 
          = new PoolingHttpClientConnectionManager();
        connManager.setValidateAfterInactivity(20);

        HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
Dandy
  • 251
  • 2
  • 5
  • Dandy one question : Even if we use setValidateAfterInactivity(), do we still need to have idle monitor thread to close the idle connections? ` public Runnable idleConnectionMonitor(PoolingHttpClientConnectionManager pool) { return new Runnable() { @Scheduled(fixedDelayString = "10000") public void run() { if (pool != null) { System.out.println("pool stats>"+pool.getTotalStats()); //pool.closeExpiredConnections(); //pool.closeIdleConnections(idleConnectionCloseThreshold, TimeUnit.MILLISECONDS); } } }; } ` – Sukh Jan 12 '21 at 15:11