Как использовать 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 () и интегрирован в конвейер. Теперь он работает как положено, последовательно вызывая удаленный ресурс.

Другие вопросы по тегам