[英]Spring WebFlux (Reactor) combine multiple non-blocking methods
使用非阻塞调用我想一般采用 Mono 并调用一个返回 Flux 的方法,对于 Flux 中的每个项目,调用一个返回 Mono 的方法以返回一个 Flux,它是 Bar + Foo + Bar 的聚合 object并且具有与 Flux 方法返回(将返回)一样多的元素。
作为一个具体的例子: 方法:
Flux<Bar> getBarsByFoo(Foo foo);
Mono<More> getMoreByBar(Bar bar);
Combined getCombinedFrom(Bar bar, Foo foo, More more);
工作代码部分:
Flux<Combined> getCombinedByFoo(Foo foo) {
getBarsByFoo(foo)...
}
从阻塞的角度来看,我想要完成的是:
List<Combined> getCombinedByFoo(Foo foo) {
List<Bar> bars = getBarsByFoo(foo):
List<Combined> combinedList = new ArrayList<>(bars.size());
for (Bar bar: bars) {
More more = getMoreByBar(bar);
combinedList.append(getCombinedFrom(bar, foo, more));
}
return combinedList;
}
任何有关使用 Flux 和 Mono 方法的帮助将不胜感激。 我仍在学习将我的大脑转变为非阻塞思维。 从概念上讲,我认为有一个 function 可以应用于从 getBarsByFoo(Foo foo) 到组合元素的 map 中的每个元素(Bar)......
是这样的:
Flux<Combined> getCombinedByFoo(Foo foo) {
return getBarsByFoo(foo)
.flatMap(bar -> getMoreByBar(bar)
.flatMap(more -> getCombinedFrom(bar, foo, more)))
}
我不知道要检查,我是徒手写的,但我猜是这样的。
我喜欢将 Reactor 编程视为操作流(如在流编程中),作为操作链/DAG。
在您的情况下,您想:
以下示例显示了您的方法的反应式版本(对于不太详细的版本,请参阅Toerktumlare 回答:
Flux<Combined> combine(Foo foo) {
Flux<Bar> bars = getBarBy(foo);
Flux<Combined> result = bars.flatMap(bar -> {
Mono<More> nextMore = getMoreBy(bar);
Mono<Combined> next = nextMore.map(more -> getCombinedFrom(foo, bar, more));
return next;
);
return result;
}
如果你通过 Mono 得到你的 foo object,你可以在上面调用flatMapMany
:
Mono<Foo> nextFoo = ...;
Flux<Combined> = nextFoo.flatMapMany(foo -> combine(foo));
flatMap非常强大:它可以触发提供的操作的并发执行。 在您的情况下,这意味着可以同时启动许多getMoreBy(bar)
操作。 但它是一把双刃剑,因为这意味着:
默认情况下并发行为非常高 (256) 并且可以通过不同的方式进行控制:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.