Как правильно создать экземпляр RestTemplate без утечки ресурсов - PullRequest
0 голосов
/ 12 октября 2018

Пожалуйста, у меня есть следующие определения 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 () иногда не может освободить сокет, выделенный методом createDefault () в строке 141. "

У кого-нибудь есть какие-либо идеи относительно того, как правильно сделать это, не вызывая повышающие сигналы тревоги

Спасибо заранее

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Я почти уверен, что вам не нужно ничего делать.Похоже, что это проблема укрепления, которая может не обновляться в этом сценарии использования.Существует механизм для исключения при работе с анализаторами кода - эти инструменты не всегда корректны.

Немного об обсуждении

Представьте себе, вы используете CloseableHttpClient в сценарии, где не было бы @Bean или HttpComponentsClientHttpRequestFactory, тогда я бы сказалэто укрепление верно, потому что это само намерение использовать java.io.Closeable.

Spring bean-компоненты обычно являются одноэлементными с намерением повторного использования экземпляров, поэтому fortify должна знать, что вы не создаете несколько экземпляров, и метод close() для AutoCloseable будет вызываться при разрушении фабрики при завершении работы.

если вы посмотрите на код - 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();
        }
    }

Ваше укрепление смотрит на код изолированно, а не интегрированным образом, поэтому он помечается.

0 голосов
/ 18 октября 2018

Отметьте эти 2 пункта для решения проблемы.

  1. Если вы никогда не вызываете метод httpClient.close(), иногда вы можете эффективно исчерпать сокет.
  2. Если вы вызываете код, то этот метод автоматически где-то не вызывает проблем.

    В любом случае, это может быть FalsePositiv в зависимости от используемой версии Java и Lib

...