programing

Spring - server.connection-timeout이 작동하지 않습니다.

megabox 2023. 6. 28. 21:35
반응형

Spring - server.connection-timeout이 작동하지 않습니다.

내 안에서application.properties내가 가지고 있는 파일은...

server.port=8086
server.connection-timeout=15000

서버가 포트 8086에서 실행되고 있기 때문에 파일이 올바르게 로드되고 있는 것으로 알고 있습니다.

응용 프로그램에서 나는RestController

@RestController
class TestController {
    @GetMapping()
    fun getValues(): ResponseEntity<*> {
        return someLongRunningProcessPossiblyHanging()
    }
}

엔드포인트를 호출하면 요청이 타임아웃되지 않고 무기한 중단됩니다.

내가 뭘 빼놓았나요?

참고: Tomcat이 이 필드를 밀리초가 아닌 분 단위로 사용한다는 소식도 들었습니다(일반적이지 않은 선택 IMO).로 설정해 보았습니다.server.connection-timeout=11분을 가리키지만, 이것도 효과가 없었습니다.

참고: 다른 HTTP 요청으로 인해 이전 요청이 시간 초과되는 것을 원하지 않습니다. 요청을 처리하기에 너무 많은 시간이 경과하면 각 HTTP 요청이 자동으로 시간 초과됩니다.

connection-timeout장시간 실행 중인 요청에는 적용되지 않습니다.서버가 클라이언트가 무언가를 말하기를 기다릴 때 초기 연결에 적용됩니다.

Tomcat 문서(Spring Boot 아님)에서 이 커넥터가 연결을 수락한 후 요청 URI 줄이 표시될 때까지 기다리는 시간(밀리초)으로 정의합니다. [...]

설정을 테스트하려면server.connection-timeout=4000사용하여 연결합니다.netcatHTTP 요청/헤더를 보내지 않습니다.이해합니다.

$ time nc -vv localhost 1234
Connection to localhost 1234 port [tcp/*] succeeded!

real    0m4.015s
user    0m0.000s
sys     0m0.000s

대안

비동기

brightinventions.pl 에서 - Spring MVC 스레드시간 초과:

Spring MVC에서는 비동기 방법을 사용하지 않는 한 시간 초과를 구성할 수 없습니다.비동기식 방법을 사용하면 spring.mvc.nvc.request-timeout=을 사용하여 비동기식 요청 처리가 시간 초과되기 전의 시간(밀리초)을 설정할 수 있습니다.

설정했습니다.spring.mvc.async.request-timeout=4000다음과 같이 브라우저에 시간 초과가 발생합니다.

@GetMapping("/test-async")
public Callable<String> getFoobar() {
   return () -> {
      Thread.sleep(12000); //this will cause a timeout
      return "foobar";
   };
}

Spring Boot REST API - 요청 시간 초과를 참조하십시오.

서블릿 필터

또 다른 솔루션은 servlet 필터 brightinventions.pl - Spring MVC(Kotlin)의 요청 시간 초과를 사용하는 것입니다.

override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
    val completed = AtomicBoolean(false)
    val requestHandlingThread = Thread.currentThread()
    val timeout = timeoutsPool.schedule({
        if (completed.compareAndSet(false, true)) {
            requestHandlingThread.interrupt()
        }
    }, 5, TimeUnit.SECONDS)

    try {
        filterChain.doFilter(request, response)
        timeout.cancel(false)
    } finally {
        completed.set(true)
    }
}

Tomcat 나사산 고착 감지 밸브?

Tomcat에는 Stuck Thread Detection 밸브가 있는데 Spring Boot을 사용하여 프로그래밍 방식으로 구성할 수 있는지 모르겠습니다.

공식 문서에서:

server.connection-interval= # 커넥터가 연결을 닫기 전에 다른 HTTP 요청을 기다리는 시간.설정하지 않으면 커넥터의 컨테이너별 기본값이 사용됩니다.값 -1을 사용하여 시간 초과 없음(즉, 무한)을 나타냅니다.

다른 심판도 마찬가지입니다.당신에게 효과가 있을 겁니다.

엔드포인트를 호출하면 요청이 타임아웃되지 않고 무기한 중단됩니다.

server.connection-timeout요청 시간 초과가 아닙니다.유휴 연결(즉, 요청/응답 쌍이 이미 있고 서버가 현재 두 번째 요청을 대기 중인 연결)에 대한 시간 초과입니다.기본적으로 서버 측 읽기 시간 제한입니다.

언급URL : https://stackoverflow.com/questions/51066238/spring-server-connection-timeout-not-working

반응형