功能介绍
public final <V> Flux<V> flatMap(Function<? super T,? extends Publisher<? extends V>> mapper, int concurrency, int prefetch)
将外部Publisher
发射出来的元素转换成内部Publisher
,然后将这些内部的Publisher
合并到一个Flux
中,允许元素交错。
mapper
:转换函数,将外部Publisher
发射出来的元素转换成一个新的Publisher
。concurrency
:针对外部Publisher
的最大请求数量,同时也是scalarQueue队列大小。可通过reactor.bufferSize.x
属性配置,默认32
。prefetch
:针对内部Publisher
的最大请求数量,同时也是innerQueue队列大小。可通过reactor.bufferSize.small
属性配置,默认256
。
代码示例
public Flux<Integer> flat(int delayMillis, int i) {
return delayPublishFlux(delayMillis, i * 10, i * 10 + 5);
}
@Test
public void test() {
delayPublishFlux(100, 1, 6)
.doOnRequest(r -> logLong(r, "main-request"))
.flatMap((i) -> flat(1000, i).doOnRequest(r -> logLong(r, "inner-request"))
.subscribeOn(Schedulers.newElastic("inner")), 3, 2)
.subscribe(i -> logInt(i, "消费"));
sleep(10000);
}
可以看到mian-request
最大是3,inner-request
最大是2。证明了concurrency
和prefetch
的作用。
源码分析
首先看一下flatMap()
操作符在装配阶段做了什么。