1

我阅读了主题 如何使用 Spring WebClient 同时进行多个调用?,但我的情况有点不同。我正在使用 webclient 调用 2 个不同的外部服务,比如说从方法 Mono < Void > A() ,然后是 Mono < Void > B ()。我的目标是从 A() 中提取数据,然后将其传递给 B()。有没有正确的方法可以避免:

  • 异步调用(导致非法 arg 异常,因为 B 在 A() 完成之前请求 args);
  • 阻塞调用,导致系统反应。

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

4

2 回答 2

1

第一个场景:

Mono<> a = getFromAByWebClient();

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

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

第二种情况:

既然B依赖于A,那为什么不在B服务里面调用A服务来获取数据呢。

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

于 2021-06-01T14:52:56.537 回答
0

好吧,我被告知如何重构代码。问题已解决,为了记忆,这里是解决方案:

  • 原始代码返回

    Mono.fromRunnable(()->apply(param param));
    
  • 方法 'apply' 在调用外部资源时订阅:

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

因此,似乎当第一个 beanA.process() 跟随 beanB.process() 时,反应式管道分崩离析,并且来自 runnable() 的 lambda 分支到单独的线程中。

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

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

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

于 2021-06-03T07:18:48.447 回答