Spring Boot 2.7 到 SprintBoot3 的 HttpClient 迁移问题

问题描述 投票:0回答:1

当我尝试从 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 等效的方法或任何其他方式可以获得相同的功能?

java spring spring-boot http apache-httpclient-5.x
1个回答
0
投票

您可以使用

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
,就像我们之前做的一样。

© www.soinside.com 2019 - 2024. All rights reserved.