Вы можете обернуть блокирующий вызов в Mono
, выполняемый в отдельном планировщике, заархивировать его с Mono
, содержащим UserState
данные, и преобразовать их комбинацию в Mono<ModelAndView>
(который может быть возвращен из методов контроллера Spring). Вызовы будут выполняться параллельно, результаты будут объединены, когда оба вызова будут завершены.
Вы можете определить один ограниченный планировщик для каждого приложения специально для блокировки вызовов и предоставить его в качестве аргумента конструктора любому классу, выполняющему блокирующие вызовы.
Код будет выглядеть следующим образом:
@Configuration
class SchedulersConfig {
@Bean
Scheduler parallelScheduler(@Value("${blocking-thread-pool-size}") int threadsCount) {
return Schedulers.parallel(threadsCount);
}
}
@RestController
class Controller {
final Scheduler parallelScheduler;
...
Mono<User> userResponse = // webClient...
Mono<Iterable<Product>> productsResponse = Mono.fromSupplier(productRepository::findAll)
.subscribeOn(parallelScheduler);
return Mono.zip(userResponse, productsResponse, (user, products) ->
new ModelAndView("messages/list",
ImmutableMap.of(
"userState", new UserState(userRequest, user),
"products", products
))
);
}
Обновление на основе комментария:
Если вам просто нужно асинхронно выполнить вызов HTTP, а затем соединить его с результатами базы данных, вы можете сделать следующее
Map<String, Object> models = new HashMap<>();
Mono<User> userMono = webClient...;
CompletableFuture<User> userFuture = userMono.toFuture();
Iterable<Product> messages = productRepository.findAll();
User user = userFuture.join();
models.put("products", messages);
models.put("userState", new UserState(userRequest, user));
return new ModelAndView("messages/list", models);
person
Ilya Zinkovich
schedule
04.06.2019
block()
а>. - person Paul Benn   schedule 03.06.2019Lock
раньше и разблокировать его в обратном вызове подписки. - person daniu   schedule 04.06.2019Mono<User>
возвращается мной, а мои клиенты будут обрабатывать все остальное. Будет немного утомительно заставлять их разбираться с замками. Может быть, я могу отзвониться прямо от них, подписаться сам и вернуть блокировку в ответ напрямую. Но я действительно удивлен, что для этого нет встроенного метода. Думаю, мне придется вернуться к старому добромуFuture
. - person Heisenberg   schedule 04.06.2019