2016-10-20 11 views
2

これは、接続を管理するためのPoolingHttpClientConnectionManagerを使用して残りのテンプレート、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; 
    } 

アムのための私の構成です。次のコードによってアクセスされている

その、

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

iは、上記の呼び出し後に接続を解除する必要はありますかそれはRestTemplateで世話をしています。私たちが接続を解放する世話をする必要がある場合。

接続を解除する方法を説明する人もいます。

答えて

6

BeanとしてClientHttpRequestFactoryを宣言する必要があります。 Beanとして宣言することで、Spring Beanファクトリによって管理されます。Spring Beanファクトリは、アプリケーションが閉じられたときにファクトリのdestroyメソッドを呼び出すか、Beanがスコープ外に出るようにします。 ClientHttpRequestFactoryのdestroyメソッドは、基礎となる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を使用することができます。

@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を使用している場合は、応答で接続を閉じる必要はありません。 Apacheの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

彼の全ポイントは、各呼び出しの接続を閉じずに、ソケットを開いたままにするためにPoolingHttpClientConnectionManagerを使用することです。 –

関連する問題