首页 > 解决方案 > 套接字超时在 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());
}

如果有任何误解,请纠正我。

标签: spring-bootresttemplateresponse-time

解决方案


套接字超时定义为两个数据包之间不活动的最长时间。这与总请求持续时间无关。因此,在您所描述的情况下,很可能是从服务器到客户端的数据传输在 1500 毫秒后开始并持续了 1000-1500 毫秒。


推荐阅读