问题描述
我阅读了主题 How to use Spring WebClient to make multiple calls simultaneously? ,但我的情况有点不同。我正在使用 webclient 调用 2 个不同的外部服务,让我们说从方法 Mono A() ,然后是 Mono B () 。我的目标是从 A() 中提取数据,然后将其传递给 B()。有没有正确的方法可以避免:
有没有标准的方法来实现它?
解决方法
第一个场景:
单声道 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() 并集成到管道中。现在它按预期工作,顺序调用远程资源。