Spring Boot Timeout при использовании фьючерсов - PullRequest
0 голосов
/ 06 декабря 2018

Я использую Spring Boot версии 2.0.6.RELEASE

У меня есть следующий метод API

    @RequestMapping(value = "/searchData", produces = { MediaType.APPLICATION_JSON_VALUE }, method = RequestMethod.GET)
public Future<List<DataEntryBean>> getSearchData() {

    return CompletableFuture.supplyAsync(() -> {

        List<DataEntryBean> dataList = dataService.getSearchData();

        return dataList;
    });
}

Метод getSearchData для запуска занимает около 40 секунд.Через 30 секунд мой код завершается с отображением в журналах следующего сообщения:

Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]

И следующий ответ json возвращает

{
  "timestamp": 1544094968149,
  "status": 503,
  "error": "Service Unavailable",
  "message": "No message available",
  "path": "/searchData"
}   

Метод getSearchData () продолжает выполняться ив итоге в логах показывается как завершающий.Если я удаляю возвращаемый тип Future и просто возвращаю список - код работает нормально.Я пробовал следующие свойства, но безуспешно, к сожалению.

spring.mvc.async.request-timeout=-1
server.connection-timeout=-1

Кто-нибудь знает, что мне нужно сделать, чтобы решить эту проблему, и все еще позволяет мне возвращать тип Future?

Спасибо, Дэмиен

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Нет параметров тайм-аута для неасинхронного запроса, поэтому при удалении будущего типа возврата асинхронный запрос становится не асинхронным запросом, и он просто отлично работает.

spring.mvc.async.request-timeoutнастройка времени ожидания для асинхронных запросов.

Вы можете установить большее значение, скажем, 60000, или просто изменить тип возвращаемого значения.

Я не думаю, что -1 фактически означает отсутствие времени ожидания для асинхронного запроса.невозможно установить тайм-аут для асинхронных запросов.

0 голосов
/ 06 декабря 2018

Попробуйте установить для этих двух свойств определенное значение, например 60 или 120. Дополнительно добавьте @EnableAsync к вашему основному классу и @Async к вашему методу.

...