Невозможно разрешить метод setReadTimeout в HttpComponentsClientHttpRequestFactory

Мне нужно перенести этот код Spring Boot на последнюю версию. После весны 6+ setReadTimeout устарел.

HttpComponentsClientHttpRequestFactory factory = new 
HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(20);
factory.setConnectTimeout(20);
factory.setConnectionRequestTimeout(20);
return new RestTemplate(factory);

Согласно JavaDoc: https://www.javadoc.io/static/org.springframework/spring-web/6.0.8/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.html#setReadTimeout(int)

Мне нужно использовать setSoTimeout, но я не могу найти этот метод. Каким должен быть правильный способ переноса этого кода?

Прочтите этот Javadoc: javadoc.io/static/org.springframework/spring-web/6.0.8/org/…

tgdavies 04.04.2024 10:52

setSoTimeout отсутствует в HttpComponentsClientHttpRequestFactory, он находится в классе SocketConfig.Builder. Этот метод уже некоторое время существует в этой библиотеке, поэтому вы сможете найти его даже в Spring версии 5.

Ethan Conrad 05.04.2024 06:24

Я не могу найти хорошее решение, как перенести код.

Peter Penzov 06.04.2024 16:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
2 453
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объект SocketConfig, в котором установлен тайм-аут, затем присваивается объекту PoolingHttpClientConnectionManager, который затем присваивается объекту HttpClient, который затем используется для инициализации HttpComponentsClientHttpRequestFactory. Полный код инициализации bean-компонента RestTemplate будет выглядеть примерно так:

import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.util.Timeout;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        RestTemplate restTemplate = restTemplateBuilder.build();

        // Connect timeout
        ConnectionConfig connectionConfig = ConnectionConfig.custom()
                .setConnectTimeout(Timeout.ofMilliseconds(20))
                .build();

        // Socket timeout
        SocketConfig socketConfig = SocketConfig.custom()
                .setSoTimeout(Timeout.ofMilliseconds(20))
                .build();

        // Connection request timeout
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(Timeout.ofMilliseconds(20))
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setDefaultSocketConfig(socketConfig);
        connectionManager.setDefaultConnectionConfig(connectionConfig);

        HttpClient httpClient = HttpClientBuilder.create()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .build();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));

        return restTemplate;
    }
}

Вам также понадобится зависимость httpclient5:

implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.2.3'

Другие вопросы по теме