有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用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分钟),但有时我还是在20秒后从服务器收到超时异常,这是我得到的异常:

org.springframework.web.client.ResourceAccessException -> I/O error on POST request for "https://my-external-service.com/service1": Connect to my-external-service.com:443 failed: Connection timed out: connect; nested exception is org.apache.http.conn.HttpHostConnectException: Connect to my-external-service.com:443 failed: Connection timed out: connect

有人知道我是在这里把超时配置搞错了还是需要配置更多的东西吗?多谢各位


共 (1) 个答案

  1. # 1 楼答案

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

    这个链接会很有帮助https://github.com/spring-projects/spring-boot/issues/11379