#spring #multithreading
#spring #многопоточность
Вопрос:
Spring позволяет методу с аннотацией @RequestMapping
возвращать различные объекты, включая a CompletableFuture
или a Future
. Это позволяет мне запускать асинхронный метод и позволять spring возвращать значение всякий раз, когда оно будет готово. Я не уверен, что понимаю, есть ли в этом какие-либо преимущества. Например:
@RestController
public class MyController {
@RequestMapping("/user/{userId}")
public CompletableFuture<User> getUser(@PathVariable("userId") String userId) {
return CompletableFuture.supplyAsync(
() -> this.dataAccess.getUser(userId));
}
В этом случае, даже если фактическое вычисление происходит в фоновом режиме, соединение все равно не будет закрыто, и поток запроса будет по-прежнему активен до его завершения. Чем это лучше, чем сказать:
@RequestMapping("/user/{userId}")
public User getUser(@PathVariableS("userId") String userId) {
return this.dataAccess.getUser(userId);
}
На первый взгляд, это кажется лучшим подходом, поскольку нет накладных расходов с дополнительным потоком и наблюдателем, который ищет завершение.
Ответ №1:
Это использует преимущества асинхронной обработки запросов Servlet 3, используя request.startAsync()
метод. Читайте здесь и здесь
Для достижения этой цели веб-приложение Servlet 3 может вызвать request.startAsync() и использовать возвращенный AsyncContext для продолжения записи в ответ из какого-либо другого отдельного потока. В то же время с точки зрения клиента запрос по-прежнему выглядит как любое другое взаимодействие HTTP-запроса и ответа. Просто для завершения требуется больше времени. Ниже приведена последовательность событий: