如何限制flatMap进程中当前正在处理的事件?

时间:2017-11-04 07:32:02

标签: limit rate-limiting project-reactor flatmap

给出以下代码

public static void main(String[] args) {

    long start = System.currentTimeMillis();

    Flux.<Long>generate(s -> s.next(System.currentTimeMillis() - start))
            .flatMap(DemoApp::delayedAction)
            .doOnNext(l -> System.out.println(l + " -- " + (System.currentTimeMillis() - start)))
            .blockLast(Duration.ofSeconds(3));
}

private static Publisher<? extends Long> delayedAction(Long l) {
    return Mono.just(l).delayElement(Duration.ofSeconds(1));
}

从输出中可以看出,大量事件已被处理&#34;同时在delayedAction。 在这个例子中,256个事件在几毫秒内生成,然后等待大约一秒,直到它们再次被发射。

我想将此数字限制为例如10,我该怎么做?

解决方案应独立于delayedAction

内发生的事情

背景

延迟行动中真正发生的事情是:我做HTTP请求并启动无限量(或非常大量)的请求并不是一个好主意。

1 个答案:

答案 0 :(得分:1)

已有一种方法:Flux.flatMap(Function> mapper, int concurrency)

从其文档:

  

concurrency参数允许控制可以订阅和并行合并的Publisher数量。