与RestTemplate的请求中的连接超时无法正常工作

时间:2018-08-06 11:47:40

标签: java spring httpclient resttemplate connection-timeout

我正在使用RestTemplate从外部服务获取数据,并且我想为请求设置超时,如下所示:

        CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setConnectTimeout(600000).setConnectionRequestTimeout(600000).setSocketTimeout(600000).build()).build();

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(client);
        requestFactory.setConnectTimeout(600000);
        requestFactory.setConnectionRequestTimeout(600000);
        requestFactory.setReadTimeout(600000);

        RestTemplate restTemplate = new RestTemplate(requestFactory);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + settings.getBase64EncodedAuthString());
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<BaseParameters> request = new HttpEntity<>(parameters, headers);

        ResponseEntity<MyResponse> response = restTemplate.exchange("https://my-external-service.com/service1", HttpMethod.POST,
                    request, MyResponse.class);

尽管我将超时设置为600000ms(10分钟),但有时我仍然只有20s的时间从服务器收到超时异常,这是我得到的异常:

  

org.springframework.web.client.ResourceAccessException-> I / O错误   的POST请求   “ https://my-external-service.com/service1”:   连接到my-external-service.com:443    失败:连接超时:   连接嵌套异常为   org.apache.http.conn.HttpHostConnectException:连接到   my-external-service.com:443   失败:连接超时:连接

有人知道我是否在此处对超时配置做错了,还是需要配置更多内容?谢谢

1 个答案:

答案 0 :(得分:0)

您正在使用HTTP请求配置,仅在完全建立连接路由后才应用请求级别配置。它不适用于SSL握手或CONNECT请求。您需要配置在创建连接时由连接管理器应用的套接字属性。

此链接将很有帮助https://github.com/spring-projects/spring-boot/issues/11379