Мне нужно перенести этот код 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, но я не могу найти этот метод. Каким должен быть правильный способ переноса этого кода?
setSoTimeout отсутствует в HttpComponentsClientHttpRequestFactory, он находится в классе SocketConfig.Builder. Этот метод уже некоторое время существует в этой библиотеке, поэтому вы сможете найти его даже в Spring версии 5.
Я не могу найти хорошее решение, как перенести код.




Объект 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'
Прочтите этот Javadoc: javadoc.io/static/org.springframework/spring-web/6.0.8/org/…