spring-boot - 套接字超时在 Rest 模板第三方 API 调用中不起作用 - Spring boot
问题描述
我正在尝试通过在第三方休息服务调用时配置套接字超时来测试响应超时。我在我的服务中通过 Spring Rest Template 调用外部 Web 服务。
出于响应超时测试目的,我配置的外部 Web 服务需要更多时间。
我已经为超时配置了 1600 毫秒,但不幸的是,我得到的响应时间超过了配置的时间,大约 2500 - 3000 毫秒。
根据配置,我应该得到超时异常。
public ClientHttpRequestFactory getClientHttpRequestFactory(String timeout) {
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(Integer.parseInt(timeout))
.setConnectionRequestTimeout(Integer.parseInt(timeout))
.setSocketTimeout(Integer.parseInt(timeout))
.build();
CloseableHttpClient closeableHttpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.build();
return new HttpComponentsClientHttpRequestFactory(closeableHttpClient);
}
public String milisecTimeout = "1600";
RestTemplate restTemplate = new RestTemplate(appConfig.getClientHttpRequestFactory(milisecTimeout));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", "application/json");
httpHeaders.set("Accept", "application/json");
httpHeaders.set("Accept-Charset", "UTF-8");
HttpEntity<String> httpEntity = new HttpEntity<>(request, httpHeaders);
String responseBody = "";
try {
ResponseEntity<String> response = restTemplate.exchange(hostUrl, HttpMethod.POST, httpEntity, String.class);
String statusCode = response.getStatusCodeValue();
String responseBody = response.getBody();
SearchRS searchSdnRS = objectMapper.readValue(responseBody, SearchRS.class);
} catch (Exception ex){
log.error("Error:", ex.getCause());
}
如果有任何误解,请纠正我。
解决方案
套接字超时定义为两个数据包之间不活动的最长时间。这与总请求持续时间无关。因此,在您所描述的情况下,很可能是从服务器到客户端的数据传输在 1500 毫秒后开始并持续了 1000-1500 毫秒。
推荐阅读
- kubernetes - 入口控制器本地集群
- spring - Tomcat 中的 LTPA 令牌(Spring 安全性)
- blazor - 在 Blazorise DataGrid 上强制刷新
- javascript - 从颜色选择器释放鼠标后调用函数
- python - 表单无效时Django不刷新站点
- python - Scapy/Python 在数据包级别发送 HTTP GET 请求
- sql-server - 设置 Azure SQL 托管实例以连接到 VPN 上的本地服务器
- c - 缓存似乎无效
- r - 聚合函数不适用于标准偏差和因子
- php - 如何在 Zend Framework 3 的服务管理器中获取“转发”控制器插件?