在使用 `RestTemplate` 发起 HTTP 请求时,你可以通过配置 `ClientHttpRequestFactory` 来增加超时设置。`RestTemplate` 默认使用的是 `SimpleClientHttpRequestFactory`,但你可以改用 `HttpComponentsClientHttpRequestFactory` 来更灵活地配置超时。
以下是如何为 `RestTemplate` 增加超时设置的示例代码:
```java
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.client.request.ClientHttpRequestFactory;
import java.util.concurrent.TimeUnit;
public class RestClient {
public static void main(String[] args) {
// 配置连接池
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100); // 最大连接数
connectionManager.setDefaultMaxPerRoute(20); // 每个路由默认最大连接数
// 配置请求参数
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000) // 连接超时时间(毫秒)
.setSocketTimeout(5000) // 读取数据超时时间(毫秒)
.setConnectionRequestTimeout(5000) // 从连接池中获取连接的超时时间(毫秒)
.build();
// 创建HttpClient
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig)
.build();
// 创建ClientHttpRequestFactory
ClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
// 创建RestTemplate
RestTemplate restTemplate = new RestTemplate(factory);
String baseUdioUrl = "http://example.com/udio";
String param = "?id=123";
HttpEntity> entity = // ... 创建你的HttpEntity,包含header等
Class responseType = UdioSongDetail.class;
// 使用RestTemplate发起请求
ResponseEntity responseEntity = restTemplate.exchange(baseUdioUrl + param, HttpMethod.GET, entity, responseType);
// 处理响应
// ...
}
}
```
在这个示例中,我们做了以下几步:
1. **配置连接池**:使用 `PoolingHttpClientConnectionManager` 来管理连接池,设置最大连接数和每个路由的默认最大连接数。
2. **配置请求参数**:使用 `RequestConfig` 来设置连接超时、读取数据超时和从连接池中获取连接的超时时间。
3. **创建 `CloseableHttpClient`**:使用配置好的连接池和请求参数来创建 `CloseableHttpClient`。
4. **创建 `ClientHttpRequestFactory`**:使用 `HttpComponentsClientHttpRequestFactory` 将 `CloseableHttpClient` 包装成 `ClientHttpRequestFactory`。
5. **创建 `RestTemplate`**:使用配置好的 `ClientHttpRequestFactory` 来创建 `RestTemplate`。
这样,你就可以在发起 HTTP 请求时应用这些超时设置了。