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=1
1분을 가리키지만, 이것도 효과가 없었습니다.
참고: 다른 HTTP 요청으로 인해 이전 요청이 시간 초과되는 것을 원하지 않습니다. 요청을 처리하기에 너무 많은 시간이 경과하면 각 HTTP 요청이 자동으로 시간 초과됩니다.
connection-timeout
장시간 실행 중인 요청에는 적용되지 않습니다.서버가 클라이언트가 무언가를 말하기를 기다릴 때 초기 연결에 적용됩니다.
Tomcat 문서(Spring Boot 아님)에서 이 커넥터가 연결을 수락한 후 요청 URI 줄이 표시될 때까지 기다리는 시간(밀리초)으로 정의합니다. [...]
설정을 테스트하려면server.connection-timeout=4000
사용하여 연결합니다.netcat
HTTP 요청/헤더를 보내지 않습니다.이해합니다.
$ 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
'programing' 카테고리의 다른 글
Firebase에서 특정 사용자 삭제 (0) | 2023.06.28 |
---|---|
Node.js의 이벤트 중심 방식은 무엇이 다릅니까?ASP에서는 그렇게 할 수 없나요?넷의 HttpAsyncHandler? (0) | 2023.06.28 |
CONCATing NULL 필드 (0) | 2023.06.28 |
SQL Server에서 증분 ID의 시작 값을 재설정하는 방법 (0) | 2023.06.28 |
Xcode에서 메서드 참조 찾기 (0) | 2023.06.28 |