Spring RestTemplate - Need to release connection?

前端 未结 3 1516
情深已故
情深已故 2021-02-05 20:44

This is my Configuration for Rest Template,

    @Bean
    @Qualifier(\"myRestService\")
    public RestTemplate createRestTemplate(@Value(\"${connection.timeout}         


        
相关标签:
3条回答
  • 2021-02-05 21:21

    You should declare the ClientHttpRequestFactory as a bean. By declaring it as a bean, it becomes managed by the Spring bean factory, which will call the factory's destroy method when the application is closed, or the bean goes out of scope. The destroy method of the ClientHttpRequestFactory will close the underlying ClientConnectionManager's connection pool. You can check the Spring API docs for this.

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

    Then you can use this bean to create your RestTemplate:

    @Bean
    @Qualifier("myRestService")
    public RestTemplate createRestTemplate(ClientHttpRequestFactory factory) {
        RestTemplate restTemplate = new RestTemplate(factory);
    
        restTemplate.setErrorHandler(new RestResponseErrorHandler());
        restTemplate.setMessageConverters(createMessageConverters());
    
        return restTemplate;
    }
    
    0 讨论(0)
  • 2021-02-05 21:24

    I think the answer is here: org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor#doExecuteRequest

        @Override
        protected RemoteInvocationResult doExecuteRequest(
                HttpInvokerClientConfiguration config, ByteArrayOutputStream baos)
                throws IOException, ClassNotFoundException {
    
            HttpPost postMethod = createHttpPost(config);
            setRequestBody(config, postMethod, baos);
            try {
                HttpResponse response = executeHttpPost(config, getHttpClient(), postMethod);
                validateResponse(config, response);
                InputStream responseBody = getResponseBody(config, response);
                return readRemoteInvocationResult(responseBody, config.getCodebaseUrl());
            }
            finally {
                postMethod.releaseConnection();
            }
        }
    
    0 讨论(0)
  • 2021-02-05 21:25

    The question which you have asked: Do i need to release the connection after the above call or is it taken care by RestTemplate. If we need to take care of releasing connection.

    No, you do not need to close the connection on the response, if you use resttemplate.

    From the apache httpclient, you need to consume the complete response (EntityUtils.consume(HttpEntity) and close the response.

    This can be verified in the ClientConnectionRelease.java

    But RestTemplate does this for you, to verify the same have a look into RestTemplate.java

    Look for method

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

    Where response extractor does the work for you by consuming the response using responseExtractor.extractData(response);

    And after extracting the data completely it is closing response.close() as well.

    0 讨论(0)
提交回复
热议问题