如何使用rxjava Flowables创建阻塞背压?

时间:2018-09-11 23:31:21

标签: java rx-java2

我有一个Flowable,我们正在返回一个函数,该函数将不断从数据库中读取并将其添加到Flowable中。

public void scan() {
    Flowable<String> flow = Flowable.create((FlowableOnSubscribe<String>) emitter -> {
        Result result = new Result();
        while (!result.hasData()) {
            result = request.query(skip, limit);
            partialResult.getResult()
                .getFeatures().forEach(feature -> emmitter.emit(feature));
        }
    }, BackpressureStrategy.BUFFER)
        .subscribeOn(Schedulers.io());
    return flow;
}

然后我有另一个可以调用此方法的对象。

myObj.scan()
        .parallel()
        .runOn(Schedulers.computation())
        .map(feature -> {
            //Heavy Computation
        })
        .sequential()
        .blockingSubscribe(msg -> {
            logger.debug("Successfully processed " + msg);
        }, (e) -> {
            logger.error("Failed to process features because of error with scan", e);
        });

我繁重的计算部分可能需要很长时间。事实如此之久,以至数据库请求很有可能在使用者完成前几个条目之前就将整个数据库加载到内存中。

我已经用rxjava读过背压,但实际上只有4个选项使我可以删除数据或将其替换为最后一个。

有没有一种方法可以使我在调用emmitter.emit(feature)时阻塞该调用,直到Flowable中有更多空间?

I.E我想将Flowable视为阻塞队列,如果该队列超出容量,则推送将进入休眠状态。

0 个答案:

没有答案