Как использовать Spring WebClient для последовательного выполнения нескольких вызовов?
Я прочитал тему Как использовать Spring WebClient для одновременного выполнения нескольких вызовов?, но мой случай немного другой. Я вызываю 2 разные внешние службы с помощью веб-клиента, скажем, из метода Mono <Void> A(), за которым следует Mono <Void> B(). Моя цель - извлечь данные из A(), а затем передать их B(). Есть ли правильный способ избежать:
- асинхронный вызов (который приводит к исключению Illegal arg, поскольку B запрашивает аргументы ДО завершения A());
- блокирующий вызов, потому что система реагирует.
Есть ли стандартный способ добиться этого?
2 ответа
Первый сценарий:
Моно <> a = getFromAByWebClient();
и вы хотите отправить эти данные в службу B через сообщение или запрос на размещение,
здесь, поскольку моно - это один объект, и вы хотите отправить его через api в сообщении или методе, поэтому эти данные должны быть с вами, здесь вы должны подождать, пока данные не поступят из первой службы, иначе он попадет в api с пустым data или приведет к исключению.
Второй сценарий:
Поскольку B зависит от A, почему бы не вызвать службу A внутри службы B и не получить данные.
Поскольку в Spring reactive все является потоком, поэтому можно выполнять операции с одними данными, пока другие не будут в пути, но те операции, которые будут выполняться, должны иметь данные.
Что ж, мне сказали, как провести рефакторинг кода. Проблема была устранена, и вот решение для запоминания:
исходный код возвращается
Mono.fromRunnable(()->apply(param param));
метод apply подписывается на вызов внешнего ресурса:
apply(param param) { service.callRemote(val x).subscribe(); <---some bl ---> };
Итак, похоже, что когда за beanB.process () следует beanA.process (), реактивный конвейер разваливается, и лямбда из runnable() переходит в отдельный поток.
Что было изменено: методы beanA и beanB применяют логику возврата -
Mono.just.flatMap(service.callRemote(val x)).then();
apply() удален, удаленный вызов помещен в flatMap () и интегрирован в конвейер. Теперь он работает как положено, последовательно вызывая удаленный ресурс.