如何正确实例化RestTemplate而不泄漏资源

时间:2018-10-12 16:17:10

标签: spring spring-rest fortify

请提供以下bean定义

 @Bean
    public RestTemplate produceRestTemplate(ClientHttpRequestFactory requestFactory){
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.setErrorHandler(restTemplateErrorHandler);
        return restTemplate;
    }

@Bean
public ClientHttpRequestFactory createRequestFactory() {
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    connectionManager.setMaxTotal(maxTotalConn);
    connectionManager.setDefaultMaxPerRoute(maxPerChannel);

    RequestConfig config = RequestConfig.custom().setConnectTimeout(100000).build();
    CloseableHttpClient httpClient = HttpClients.createDefault();
    return new HttpComponentsClientHttpRequestFactory(httpClient);
}

代码运行良好,但问题是fortify将上面的代码标记为以下代码可能有问题

  

“有时函数createRequestFactory()   无法释放第141行上由createDefault()分配的套接字。”

请任何有任何想法的人如何正确地做到这一点,而不必强加警报

预先感谢

2 个答案:

答案 0 :(得分:1)

我很确定您不需要做任何事情。似乎无法解决此使用情况,这是一个有力的问题。使用代码分析器时,有一种机制可以排除异常-这些工具并不总是正确的。

一些讨论

想象一下,您在没有CloseableHttpClient@Bean的情况下使用HttpComponentsClientHttpRequestFactory,那么我会说强化是正确的,因为那是使用java.io.Closeable

Spring bean通常是单例的,目的是要重用实例,因此,强化应该知道您没有创建多个实例,并且在关闭工厂时销毁了AutoCloseable上的close()方法。

如果您查看--org.springframework.http.client.HttpComponentsClientHttpRequestFactory的代码,就在这里。

/**
     * Shutdown hook that closes the underlying
     * {@link org.apache.http.conn.HttpClientConnectionManager ClientConnectionManager}'s
     * connection pool, if any.
     */
    @Override
    public void destroy() throws Exception {
        if (this.httpClient instanceof Closeable) {
            ((Closeable) this.httpClient).close();
        }
    }

您的要害是孤立地查看代码,而不是以集成的方式查看代码,因此标记是。

答案 1 :(得分:0)

检查这2点,以解决问题。

  1. 如果您从不调用httpClient.close()方法,那么有时您可以有效地 用完套接字。
  2. 如果您的代码是在某个地方自动调用此方法,则不会有任何问题。

    无论如何,根据您使用的Java和Lib的版本,这可能是FalsePositiv