如何限制Single.Zip并发?

时间:2019-05-21 23:44:08

标签: java groovy rx-java2

我正在执行几个http请求,等待所有请求完成,并使用所有请求(以及其他几个来源)的信息来计算结果。

目前我正在这样做:

Single.zip(observables, { array -> array })

可观察对象只是可观察对象的数组,每个观察对象都执行异步操作。

但是我可以同时执行多少操作有一个限制。一次最多只能有n个操作。 (理想情况下,n为5,但也可以接受1)

不幸的是,Zip似乎在没有等待任何操作完成的情况下开始了所有操作。有没有办法限制这种行为?

1 个答案:

答案 0 :(得分:0)

也许您可以结合使用window()运算符和zip()? 像这样:

public static void main(String[] args) {
    Flowable<Integer>[] flowables = new Flowable[] {
            Flowable.just(1), Flowable.just(2), Flowable.just(3), Flowable.just(4), Flowable.just(5),
            Flowable.just(6), Flowable.just(7), Flowable.just(8), Flowable.just(9)
    };

    Flowable.fromArray(flowables)
            .window(5)
            .flatMap(f -> Flowable.zip(f, objects -> Arrays.stream(objects).map(Object::toString).collect(joining("")))
                                  .flatMapSingle(Single::just))
            .subscribe(s -> System.out.println("received: " + s));


    Flowable.timer(10, SECONDS) // Just to block the main thread for a while
            .blockingSubscribe();
}

window()会将可流动物分成FlowableFlowable。每个可流动元素仅发射5个元素(可以是您想要的操作数)。 在此示例中,zip()仅连接了给定的整数。 它将打印:

received: 12345
received: 6789

我希望这会有所帮助。