如何使用 Spring WebClient 依次进行多次调用?

问题描述

我阅读了主题 How to use Spring WebClient to make multiple calls simultaneously? ,但我的情况有点不同。我正在使用 webclient 调用 2 个不同的外部服务,让我们说从方法 Mono A() ,然后是 Mono B () 。我的目标是从 A() 中提取数据,然后将其传递给 B()。有没有正确的方法可以避免:

  • 异步调用(这会导致非法参数异常,因为 B 在 A() 完成之前请求参数);
  • 阻塞调用,导致系统响应。

有没有标准的方法来实现它?

解决方法

第一个场景:

单声道 a = getFromAByWebClient();

并且您想通过 post 或 put 请求将此数据发送到调用服务 B,

这里,由于mono是一个对象,并且您想在post或方法中通过api发送它,因此必须随身携带该数据,在这里您应该等到数据不是来自第一个服务,否则它会命中api 有空白数据,否则会导致异常。

第二种情况:

既然B依赖于A,为什么不在B服务内部调用A服务获取数据。

由于在 Spring 响应式中一切都是流,因此可以对一个数据进行操作,直到其他数据在路上,但将要执行的操作应该有数据。

,

好吧,有人告诉我如何重构代码。问题已解决,为了便于记忆,以下是解决方案:

  • 原码返回

    Mono.fromRunnable(()->apply(param param));
    
  • 方法“apply”订阅外部资源:

      apply(param param) {
      service.callRemote(val x).subscribe();
    
      <---some bl --->
    
      };
    

所以,当第一个 beanA.process() 跟随 beanB.process() 时,反应式管道分崩离析,而 lambda 从 runnable() 分支到单独的线程中。

改变了什么: beanA 和 beanB 方法应用返回逻辑 -

     Mono.just.flatMap(service.callRemote(val x)).then();

apply() 已被移除,远程调用包装到 flatMap() 并集成到管道中。现在它按预期工作,顺序调用远程资源。