Spring Boot REST API에서 시간 초과를 설정하는 방법은 무엇입니까?
REST API를 실행하는 데 시간이 좀 걸릴 수 있는데 실행 기간을 제한하고 싶습니다.가급적이면 30초가 지나도 요청이 돌아오지 않으면 특정 HTTP 코드/데이터를 반환하고 해당 요청을 완전히 종료하고 싶습니다.
현재 코드:
@RestController
@CrossOrigin(origins = {"*"}, maxAge = 4800, allowCredentials = "false")
public class APIController {
@RequestMapping(value = "/api/myapifunc", method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<?> optimize(@RequestParam(value="param1", defaultValue="")) {
// Code here
}
회로 차단기 패턴을 설명하는 것 같습니다.클라이언트와 서버 코드를 모두 제어할 수 있으며 Spring Cloud 및 Netflix Histerix 라이브러리를 탐색하려면 시작하기: 회로 차단기 가이드.
Apache Tomcat을 서블릿 컨테이너로 사용하는 경우 Stuck Thread Detection 밸브를 구성할 수 있습니다.
이 밸브를 사용하면 처리하는 데 시간이 오래 걸리는 요청을 감지할 수 있으며, 이는 요청을 처리하는 스레드가 고착되었음을 나타낼 수 있습니다.또한 선택적으로 이러한 스레드를 중단하여 차단을 해제할 수 있습니다.
이러한 요청이 탐지되면 해당 스레드의 현재 스택 추적이 WARN 수준으로 Tomcat 로그에 기록됩니다.
고착된 나사산의 ID와 이름은 고착된 나사산의 JMX를 통해 사용할 수 있습니다.스레드 ID 및 고착스레드 이름 특성입니다.ID는 표준 스레드화 JVM Mean(java.lang:type=Distring)과 함께 사용하여 고착된 각 스레드에 대한 다른 정보를 검색할 수 있습니다.
Spring Boot 2.3 / Tomcat 9를 사용하면 Tomcat을 설치하여 들어오는 모든 HTTP 요청이 완료되는 시간 제한을 설정할 수 있습니다.StuckThreadDetectionValve
필요한 Spring 구성 코드는 다음과 같습니다(Kotlin입니다).
import org.apache.catalina.valves.StuckThreadDetectionValve
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class RequestTimeoutConfiguration(
@Value("\${app.tomcat.stuck-thread-detection.request-timeout.seconds}")
private val stuckThreadTimeoutSeconds: Int
) {
@Bean
fun stuckThreadDetectionValve() =
StuckThreadDetectionValve().apply {
threshold = stuckThreadTimeoutSeconds
interruptThreadThreshold = stuckThreadTimeoutSeconds
}
@Bean
fun stuckThreadDetectionWebServerFactoryCustomizer(valve: StuckThreadDetectionValve) =
WebServerFactoryCustomizer { factory: TomcatServletWebServerFactory ->
factory.addContextValves(valve)
}
}
그러면 당신은 단지 부동산이 필요한 것은application.properties
제어하기:
app.tomcat.stuck-thread-detection.request-timeout.seconds=130
@RequestMapping(value = "/api/myapifunc", method = RequestMethod.POST, produces =
"application/json")
public ResponseEntity<?> optimize(@RequestParam(value="param1", defaultValue="")) {
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(3000); //this will cause a timeout
return "foobar";
}
};
}
사용할 수 있는 미래 또는 주석@Timed @Transactional(timeout = 3000)
미래 시간 제한을 사용할 수 있습니다.
final Future<Object> submit = service.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
......YOUR CODE
return "";
}
});
try {
submit.get(3, TimeUnit.SECONDS);
} catch (Exception e) {
log.error("fail",e);
}
이 속성 구성을 설정할 수 있습니다.
server.connection-timeout=30000
사용자의 application.properties에 있습니다.공식 문서에 따르면 다음과 같습니다.
server.connection-interval= # 커넥터가 연결을 닫기 전에 다른 HTTP 요청을 기다리는 시간.설정하지 않으면 커넥터의 컨테이너별 기본값이 사용됩니다.값 -1을 사용하여 시간 초과 없음(즉, 무한)을 나타냅니다.
언급URL : https://stackoverflow.com/questions/54080658/how-to-set-a-timeout-on-a-spring-boot-rest-api
'code' 카테고리의 다른 글
도커 엔트리 포인트와 쿠버네티스 컨테이너 사양 명령의 차이점은 무엇입니까? (0) | 2023.09.05 |
---|---|
왜 tqdm 인쇄가 같은 라인을 업데이트하는 대신 새로운 라인으로 진행됩니까? (0) | 2023.09.05 |
도커 컨테이너에 셸링한 후 파일을 편집하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
빠른 언어 NSClassFromString (0) | 2023.09.05 |
10분마다 vba를 실행시키는 방법은? (0) | 2023.09.05 |