Project Reactor源码阅读-flatMap

功能介绍

public final <V> Flux<V> flatMap(Function<? super T,? extends Publisher<? extends V>> mapper, int concurrency, int prefetch)

将外部Publisher发射出来的元素转换成内部Publisher,然后将这些内部的Publisher合并到一个Flux中,允许元素交错

  1. mapper:转换函数,将外部Publisher发射出来的元素转换成一个新的Publisher
  2. concurrency:针对外部Publisher的最大请求数量,同时也是scalarQueue队列大小。可通过reactor.bufferSize.x属性配置,默认32
  3. 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。证明了concurrencyprefetch的作用。

源码分析

首先看一下flatMap()操作符在装配阶段做了什么。

Flux#flatMap()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值