code

Spring Boot REST API에서 시간 초과를 설정하는 방법은 무엇입니까?

starcafe 2023. 9. 5. 20:40
반응형

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

반응형