복붙노트

[SPRING] RestTemplate - 기본 타임 아웃 값

SPRING

RestTemplate - 기본 타임 아웃 값

Spring의 RestTemplate을 사용할 때 기본 타임 아웃 값은 얼마입니까?

예를 들어 다음과 같은 웹 서비스를 호출합니다.

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);

RestTemplate에 내장 된 시간 초과 값이 있습니까? 타임 아웃 값을 변경할 계획이 아니지만 모든 요청에 ​​대해 합당한 시간 초과가 있는지 확인하고자합니다.

해결법

  1. ==============================

    1.시간 초과 매개 변수에 SimpleClientHttpRequestFactory를 사용할 수 있다고 생각합니다. SimpleClientHttpRequestFactory의 인스턴스는 생성자 또는 설정 메서드로 템플릿을 나머지로 설정할 수 있습니다.

    시간 초과 매개 변수에 SimpleClientHttpRequestFactory를 사용할 수 있다고 생각합니다. SimpleClientHttpRequestFactory의 인스턴스는 생성자 또는 설정 메서드로 템플릿을 나머지로 설정할 수 있습니다.

    기본적으로 RestTemplate은 SimpleClientHttpRequestFactory를 사용하므로 값을 restTemplate에 직접 설정할 수 있습니다.

  2. ==============================

    2.Spring-android RestTemplate의 멋진 기능 중 하나는 OS 버전에 따라 RequestFactory를 적절히 구현 한 것입니다 (Google에서 권장).

    Spring-android RestTemplate의 멋진 기능 중 하나는 OS 버전에 따라 RequestFactory를 적절히 구현 한 것입니다 (Google에서 권장).

    따라서 HttpComponentsClientHttpRequestFactory (Android OS 버전 <2.3) 용 spring-android에서 사용되는 HttpComponentsClientHttpRequestFactory는 고려되지 않았기 때문에 이전 답변이 가득차 있지 않습니다.

    내 솔루션은 다음과 같습니다.

    public class MyRestTemplate extends RestTemplate {
        public MyRestTemplate() {
            if (getRequestFactory() instanceof SimpleClientHttpRequestFactory) {
                Log.d("HTTP", "HttpUrlConnection is used");
                ((SimpleClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
                ((SimpleClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
            } else if (getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) {
                Log.d("HTTP", "HttpClient is used");
                ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
                ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
            }
        }
    }
    
  3. ==============================

    3.명시 적으로 질문에 답변하려면 ...

    명시 적으로 질문에 답변하려면 ...

    기본 제한 시간은 무한합니다.

    기본적으로 RestTemplate은 SimpleClientHttpRequestFactory를 사용하고 HttpURLConnection을 사용합니다.

    기본적으로 HttpURLConnection의 시간 제한은 0입니다. 즉, 다음 속성에 의해 설정되지 않은 한 무한대입니다.

    -Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
    -Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
    
  4. ==============================

    4.RestTemplate 생성자에서 ClientHttpRequestFactory 매개 변수를 사용할 수 있습니다.

    RestTemplate 생성자에서 ClientHttpRequestFactory 매개 변수를 사용할 수 있습니다.

    private final int HTTP_CONNECT_TIMEOUT = 15000;
    private final int HTTP_READ_TIMEOUT = 10000;
    
    private ClientHttpRequestFactory getClientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        clientHttpRequestFactory.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
        clientHttpRequestFactory.setReadTimeout(HTTP_READ_TIMEOUT);
        return clientHttpRequestFactory;
    }
    

    새 RestTemplate이 필요할 때 다음 예제와 같이 만듭니다.

    RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());
    
  5. from https://stackoverflow.com/questions/11537591/resttemplate-default-timeout-value by cc-by-sa and MIT license