Как установить таймаут в Spring Boot REST API? - PullRequest
0 голосов
/ 07 января 2019

У меня есть несколько 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
}

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Похоже, вы описываете схему автоматического выключателя . Если у вас есть контроль над клиентским и серверным кодом и вы хотите изучить библиотеки Spring Cloud и Netflix Hysterix, вы можете взглянуть на Getting Started: Circuit Breaker guide.

Если вы используете Apache Tomcat в качестве контейнера сервлета, вы можете настроить Заслонка для обнаружения потока :

Этот клапан позволяет обнаруживать запросы, для обработки которых требуется много времени, что может указывать на то, что поток, обрабатывающий его, застрял. Кроме того, он может при желании прервать такие потоки, чтобы попытаться разблокировать их.

При обнаружении такого запроса текущая трассировка стека его потока записывается в журнал Tomcat с уровнем WARN.

Идентификаторы и имена застрявших потоков доступны через JMX в атрибутах stuckThreadIds и stuckThreadNames. Идентификаторы можно использовать со стандартным MBean-компонентом JVM для потоков (java.lang: type = Threading) для получения другой информации о каждом застрявшем потоке.

0 голосов
/ 07 января 2019

Вы можете установить это свойство конфигурации

 server.connection-timeout=30000 

в вашем приложении. Свойства. На основании официальной документации написано:

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

0 голосов
/ 07 января 2019
@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)

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