Spring - не работает тайм-аут server.connection - PullRequest
0 голосов
/ 27 июня 2018

В моем 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-запрос сам по себе истекал, если должно быть слишком много времени истечь, чтобы обслужить запрос.

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Когда я вызываю конечную точку, запрос никогда не прерывается, он просто висит бесконечно.

server.connection-timeout не время ожидания запроса. Это тайм-аут для незанятых соединений, то есть тех, у которых уже была пара запрос / ответ, и на которых сервер теперь ожидает второй запрос. По сути, это тайм-аут чтения на стороне сервера.

0 голосов
/ 03 июля 2018

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.

0 голосов
/ 02 июля 2018

Из официальных документов :

server.connection-timeout = # Время ожидания соединителями другого HTTP-запроса перед закрытием соединения. Если не задано, используется значение по умолчанию для конкретного соединителя. Используйте значение -1, чтобы указать отсутствие (то есть бесконечное) время ожидания.

Другой ref также упоминает то же самое. Это должно работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...