[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.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.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.잠재적으로 신뢰할 수 없거나 느린 원격 호출을 처리하기 위해 Spring Cloud Netflix Hystrix 시동기를 살펴 보길 권한다. 이것은 회로 차단기 패턴을 구현합니다.이 패턴은 정확하게이 일종의 문제입니다.
잠재적으로 신뢰할 수 없거나 느린 원격 호출을 처리하기 위해 Spring Cloud Netflix Hystrix 시동기를 살펴 보길 권한다. 이것은 회로 차단기 패턴을 구현합니다.이 패턴은 정확하게이 일종의 문제입니다.
자세한 내용은 공식 문서를 참조하십시오.
-
==============================
4.@Transactional 어노테이션은 @RestController의 특정 메소드에 대한 시간 초과를 초 단위로 지정할 수있는 timeout 매개 변수를 사용합니다
@Transactional 어노테이션은 @RestController의 특정 메소드에 대한 시간 초과를 초 단위로 지정할 수있는 timeout 매개 변수를 사용합니다
@RequestMapping(value = "/method", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Timed @Transactional(timeout = 120)
-
==============================
5.application.properties에서 server.connection-timeout = 5000을 시도 할 수 있습니다. 공식 문서에서 :
application.properties에서 server.connection-timeout = 5000을 시도 할 수 있습니다. 공식 문서에서 :
반면, 이미 내 대답은 여기에 설명 된대로 회로 차단기 패턴을 사용하여 클라이언트 쪽에서 시간 초과를 처리 할 수 있습니다. https://stackoverflow.com/a/44484579/2328781
-
==============================
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 초의 타임 아웃을 제공합니다.
from https://stackoverflow.com/questions/34852236/spring-boot-rest-api-request-timeout by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring : 네임 스페이스와 web.xml의 contextConfigLocation 초기화 매개 변수 (0) | 2018.12.09 |
---|---|
[SPRING] 전송 요청이 다중 요청 인 경우 CSRF 토큰이 작동하지 않습니다. (0) | 2018.12.09 |
[SPRING] Spring 4.2.3 및 fasterxml Jackson 2.7.0은 호환되지 않습니다. (0) | 2018.12.08 |
[SPRING] Javascript 긴 정수 (0) | 2018.12.08 |
[SPRING] 최대 절전 모드 세션 및 트랜잭션 관리와 Spring을 통합하는 방법은 무엇입니까? (0) | 2018.12.08 |