2016-10-20 2 views
2

Это моя конфигурация для отдыха Шаблона,Spring RestTemplate - нужно освободить соединение?

@Bean 
    @Qualifier("myRestService") 
    public RestTemplate createRestTemplate(@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(); 
     ClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); 

     RestTemplate restTemplate = new RestTemplate(factory); 

     restTemplate.setErrorHandler(new RestResponseErrorHandler()); 
     restTemplate.setMessageConverters(createMessageConverters()); 

     return restTemplate; 
    } 

Am использование PoolingHttpClientConnectionManager для управления соединениями.

Его осуществляется доступ к следующему коду,

ResponseEntity<String> response = restClient.exchange(url, HttpMethod.GET, entity , String.class); 

мне нужно освободить соединение после вызова выше или она позаботилась по RestTemplate ли. Если нам нужно позаботиться о выпуске соединения.

Возможно, кто-нибудь объяснит/покажет, как освободить соединение.

ответ

6

Вы должны объявить ClientHttpRequestFactory в качестве компонента. Объявляя его как фасоль, он управляется фабрикой весеннего боба, которая будет вызывать метод уничтожения фабрики, когда приложение закрыто, или компонент перестает работать. Метод destroy ClientHttpRequestFactory закрывает базовый пул соединений ClientConnectionManager. Для этого вы можете проверить документы Spring API.

@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); 
} 

Затем вы можете использовать этот компонент для создания RestTemplate:

@Bean 
@Qualifier("myRestService") 
public RestTemplate createRestTemplate(ClientHttpRequestFactory factory) { 
    RestTemplate restTemplate = new RestTemplate(factory); 

    restTemplate.setErrorHandler(new RestResponseErrorHandler()); 
    restTemplate.setMessageConverters(createMessageConverters()); 

    return restTemplate; 
} 
+0

Пожалуйста, можете ли вы объяснить более четко, возможно, с образцами кода. – Umar

3

Вопрос, который вы задали: я должен освободить соединение после вышеуказанного вызова делать или она позаботилась по RestTemplate. Если нам нужно позаботиться о выпуске соединения.

Нет, вам не нужно закрывать соединение при ответе, если вы используете resttemplate.

С апача HTTPClient, вы должны потреблять полный ответ (EntityUtils.consume (HttpEntity) и закрыть ответ.

Это может быть проверено в ClientConnectionRelease.java

Но RestTemplate делает это для вас , чтобы проверить то же взглянуть в RestTemplate.java

Посмотрите на метод

protected <T> 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(); 
     } 

    } 
} 

Где ответчик-экстрактор выполняет работу за вас, потребляя ответ, используя responseExtractor.extractData (response);

И после извлечения данных полностью закрывается response.close().

+0

его цель состоит в том, чтобы не закрывать соединения для каждого вызова и использовать apache PoolingHttpClientConnectionManager, чтобы держать сокет открытым? –

Смежные вопросы