복붙노트

[SPRING] 봄 부팅 REST API - 요청 제한 시간?

SPRING

봄 부팅 REST API - 요청 제한 시간?

Spring Boot REST 서비스를 사용하여 때때로 제 3 자 서비스를 요청의 일부로 호출합니다. 내 모든 리소스에 대한 제한 시간을 설정하고 싶습니다 (5 초라고 가정 해 봅시다). 요청 처리 (전체 체인, 수신에서 응답까지)가 5 초보다 오래 걸리면 컨트롤러가 실제 응답 대신 HTTP 503으로 응답합니다 . 이것이 단지 Spring 속성 일 경우에는 좋을 것입니다 (예 : 설정).

spring.mvc.async.request-timeout=5000

하지만 나는 그걸로 운이 없었어요. 또한 WebMvcConfigurationSupport를 확장하고 configureAsyncSupport를 재정의했습니다.

@Override
public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
    configurer.setDefaultTimeout(5000);
    configurer.registerCallableInterceptors(timeoutInterceptor());
}

@Bean
public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
    return new TimeoutCallableProcessingInterceptor();
}

행운도없이.

내 모든 제 3 자 호출을 수동으로 시간을 측정해야하고, 너무 오래 걸리면 시간 초과 예외가 발생합니다. 그게 맞습니까? 아니면 모든 요청 엔드 포인트를 다루는보다 쉽고 전체적인 솔루션이 있습니까?

해결법

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

    1.spring.mvc.async.request-timeout = 5000을 사용하려면 Callabe을 반환해야합니다.

    spring.mvc.async.request-timeout = 5000을 사용하려면 Callabe을 반환해야합니다.

    @RequestMapping(method = RequestMethod.GET)
    public Callable<String> getFoobar() throws InterruptedException {
        return new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(8000); //this will cause a timeout
                return "foobar";
            }
        };
    }
    
  2. ==============================

    2.RestTemplate을 사용하는 경우 다음 코드를 사용하여 시간 제한을 구현해야합니다.

    RestTemplate을 사용하는 경우 다음 코드를 사용하여 시간 제한을 구현해야합니다.

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(clientHttpRequestFactory());
    }
    
    private ClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(2000);
        factory.setConnectTimeout(2000);
        return factory;
    }}
    

    xml 설정

    <bean class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"
            p:readTimeout="2000"
            p:connectTimeout="2000" />
    </constructor-arg>
    

  3. ==============================

    3.잠재적으로 신뢰할 수 없거나 느린 원격 호출을 처리하기 위해 Spring Cloud Netflix Hystrix 시동기를 살펴 보길 권한다. 이것은 회로 차단기 패턴을 구현합니다.이 패턴은 정확하게이 일종의 문제입니다.

    잠재적으로 신뢰할 수 없거나 느린 원격 호출을 처리하기 위해 Spring Cloud Netflix Hystrix 시동기를 살펴 보길 권한다. 이것은 회로 차단기 패턴을 구현합니다.이 패턴은 정확하게이 일종의 문제입니다.

    자세한 내용은 공식 문서를 참조하십시오.

  4. ==============================

    4.@Transactional 어노테이션은 @RestController의 특정 메소드에 대한 시간 초과를 초 단위로 지정할 수있는 timeout 매개 변수를 사용합니다

    @Transactional 어노테이션은 @RestController의 특정 메소드에 대한 시간 초과를 초 단위로 지정할 수있는 timeout 매개 변수를 사용합니다

    @RequestMapping(value = "/method",
        method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE)
    @Timed
    @Transactional(timeout = 120)
    
  5. ==============================

    5.application.properties에서 server.connection-timeout = 5000을 시도 할 수 있습니다. 공식 문서에서 :

    application.properties에서 server.connection-timeout = 5000을 시도 할 수 있습니다. 공식 문서에서 :

    반면, 이미 내 대답은 여기에 설명 된대로 회로 차단기 패턴을 사용하여 클라이언트 쪽에서 시간 초과를 처리 할 수 ​​있습니다. https://stackoverflow.com/a/44484579/2328781

  6. ==============================

    6.Spring 속성 파일에서이 속성의 번호를 지정할 수 없다. 또한 단위를 지정해야합니다. 따라서 spring.mvc.async.request-timeout = 5000ms 또는 spring.mvc.async.request-timeout = 5s라고 말할 수 있습니다. 둘 다 5 초의 타임 아웃을 제공합니다.

    Spring 속성 파일에서이 속성의 번호를 지정할 수 없다. 또한 단위를 지정해야합니다. 따라서 spring.mvc.async.request-timeout = 5000ms 또는 spring.mvc.async.request-timeout = 5s라고 말할 수 있습니다. 둘 다 5 초의 타임 아웃을 제공합니다.

  7. from https://stackoverflow.com/questions/34852236/spring-boot-rest-api-request-timeout by cc-by-sa and MIT license