Асинхронные результаты Spring RestController

Сообщение в блоге http://farazdagi.com/blog/2014/rest-long-running-jobs (а также упомянутые ресурсы) рекомендуют использовать следующий сценарий при использовании REST для ожидания длительных заданий.

  • Немедленно возвращайте полезную нагрузку, если результат уже доступен при возврате запросов. Выглядит как стандартный запрос с кодом состояния OK.
  • Ответьте с кодом состояния ACCEPTED и добавьте Location, а также заголовок Async-Result, чтобы клиенты знали, что они должны...
  • Опросите возвращенное местоположение с помощью GET и подождите, пока заголовок Async-Result не изменится на Available или Cancelled.
  • В случае Доступно возвращается код состояния SEE_OTHER и другой заголовок Location. Следуйте по локации, чтобы получить результат.

Я знал, что могу вернуться, например. CompletableFuture из метода, но это заблокирует запрос до тех пор, пока не будет завершено будущее. Есть ли какая-либо поддержка такого поведения в Spring MVC или есть ли способ улучшить Spring MVC для реализации этого поведения (например, реализовать org.springframework.web.method.support.HandlerMethodReturnValueHandler ?)


person Peter Rietzler    schedule 09.05.2017    source источник
comment
Вы уже можете это сделать. Ничто не мешает вам сделать это с помощью обычного @RestController... У вас будет 1 метод, который либо возвращает 1, либо 2. В случае 2 ваш клиент должен опросить данный URL-адрес (который вы можете реализовать). Для этого не нужно ничего кастомного.   -  person M. Deinum    schedule 09.05.2017


Ответы (1)


Чтобы добиться поведения, рекомендованного в этом сообщении блога с Spring, вы не должны не возвращать CompletableFuture из вашего контроллера, если только это будущее уже не завершено (в этом случае код состояния должен быть 201).

В противном случае вы должны создать пустой ответ только с заголовком Location (содержащим URL-адрес задачи) и кодом состояния 202 и вместо этого вернуть его, если isDone() возвращает false для вашего будущего.

person Costi Ciudatu    schedule 09.05.2017