当我尝试从 Spring Boot 2 迁移到 SpringBoot 3 时遇到问题。
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.util.concurrent.TimeUnit;
import org.apache.http.HttpHost;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.SocketConfig;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
@RefreshScope
public class RestTemplateConfig{
int timeout=10000;
int readTimeout=10000;
int retryCount=3;
int timeToLive=5000;
String rProxy=proxy.test.com;
String rPort=80;
public RestTemplate restTemplate() {
return new RestTemplate(getClientHttpRequestFactory());
}
private ClientHttpRequestFactory getClientHttpRequestFactory() {
Httphost proxy new HttpHost(rProxy, Integer.parseInt(rPort));
SocketConfig socketConfig=SocketConfig.custom()
.setSoTimeout(timeout)
.build();
RequestConfig requestConfig=RequestConfig.custom()
.setConnectionRequestTimeout(timeout)
.setConnectTimeout(timeout)
.setSocketTimeout(timeout)
.build();
HttpClient httpClient=HttpClients.custom().setProxy(proxy)
.setDefaultSocketConfig(socketConfig)
.setDefaultRequestConfig(requestConfig)
.setRetryHandler(new DefaultHttpRequestRetryHandler(retryCount, true))
.setConnectionTimeToLive(timeToLive, TimeUnit.MILLISECONDS)
.build();
HttpComponentsClientHttpRequestFactory rf=new HttpComponentsClientHttpRequestFactory(httpClient):
rf.setConnectTimeout(timeout); rf.setReadTimeout(readTimeout);
rf.setConnectionRequestTimeout(timeout);
return rf;
}
我收到错误:
构造函数 HttpComponsentsClientHttpRequestFactory(HttpClient) 未定义。
在SpringBoot3 HttpComponsentsClientHttpRequestFactory构造函数中似乎只需要org.apache.hc.client5.http.classic.HttpClient
我做了以下更改[将类更改为httpClient5]:
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.HttpHost;
import org.apache.hc.client5.http.impl.classic.HttpClients;
但是出现错误:
对于 HttpClientBuilder 类型,方法 setDefaultSocketConfig(SocketConfig) 未定义
HttpClient httpClient=HttpClients.custom().setProxy(proxy)
.setDefaultSocketConfig(socketConfig)
.setDefaultRequestConfig(requestConfig)
.setRetryHandler(new DefaultHttpRequestRetryHandler(retryCount, true))
.setConnectionTimeToLive(timeToLive, TimeUnit.MILLISECONDS)
.build();
是否有与 setDefaultSocketConfig 等效的方法或任何其他方式可以获得相同的功能?
您可以使用
ConnectionManager
创建一个 SocketConfig
并将该 ConnectionManager
传递给您正在使用的 HttpClientBuilder
。
例如,
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultSocketConfig(socketConfig)
.build();
然后,
HttpClient httpClient=HttpClients.custom().setProxy(proxy)
.setConnectionManager(connectionManager)
.build()
您还可以在
timeToLive
中设置 ConnectionConfig
并将其传递给 ConnectionManager
,就像
final ConnectionConfig connectionConfig = ConnectionConfig
.custom()
.setTimeToLive(TimeValue.ofMilliseconds(...))
.build();
那么,
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultSocketConfig(socketConfig)
.setDefaultConnectionConfig(connectionConfig)
.build();
您可以将这个
ConnectionManager
传递给HttpClientBuilder
,就像我们之前做的一样。