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
Альтернатива
1) Async
С brightinventions.pl - Тайм-ауты пула потоков Spring MVC :
В Spring MVC нет способа настроить время ожидания, если вы не используете асинхронный метод. С помощью асинхронного метода можно использовать spring.mvc.async.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";
};
}
См. REST API Spring Boot - время ожидания запроса?
2) Фильтр сервлетов
Другим решением было бы использование фильтра сервлетов 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)
}
}
3) Tomcat Застрял клапан обнаружения резьбы?
Tomcat имеет клапан обнаружения застрявшей резьбы , но я не знаю, можно ли это настроить программным способом с помощью Spring Boot.