繁体   English   中英

RxJava - 在flatMap之后没有调用Flowable.map

[英]RxJava - Flowable.map not getting called after flatMap

我对rxjava中的Flowable <T> vs Observable <T>有一个奇怪的问题(io.reactivex.rxjava2 - v2.0.8)。 这里我的代码如下所示,其中map(...)。subscribe(...)函数没有被调用/执行。

flowable.flatMap(...return new flowable...).map(...).subscribe(...)

令人惊讶的是,如果我翻转我的代码以使用Observable <T>而不是Flowable <T>,则会按预期调用/执行map(...)。subscribe(...) 我可能会遗漏一些简单的东西,让我知道它可能是什么?

谢谢

`

public class Application {
    public static void main(String[] args) {      
        // Note: Working; get the list of databases
        DatabaseFlowable databases = new DatabaseFlowable(sourceClient);
        // Note: Working; for each database get the list of collections in it
        Flowable<Resource> resources = databases
            .flatMap(db -> {
                logger.info(" ==> found database {}", db.getString("name"));
                return new CollectionFlowable(sourceClient, db.getString("name"));
                // Note: Working; CollectionFlowable::subscribeActual works as well
            });
        resources
            .map(resource -> {
                // Note: Nothing in here gets executed
                logger.info(" ====> found resource {}", resource.toString());
                return resource;
            })
            .subscribe(m -> {
                // Note: Nothing in here gets executed
                logger.info(m.toString());
            });
    }
}



public class DatabaseFlowable extends Flowable<Document> {
    private final static Logger logger = LoggerFactory.getLogger(DatabaseFlowable.class);
    private final MongoClient client;

    public DatabaseFlowable(MongoClient client) {
        this.client = client;
    }

    @Override
    protected void subscribeActual(Subscriber<? super Document> subscriber) {
        ListDatabasesIterable<Document> cursor = client.listDatabases();
        MongoCursor<Document> iterator = cursor.iterator();

        while(iterator.hasNext()) {
            Document item = iterator.next();
            if (!item.isEmpty()) {
                    String message = String.format(" found database name: %s, sizeOnDisk: %s",
                            item.getString("name"), item.get("sizeOnDisk"));
                    logger.info(message);
                    subscriber.onNext(item);
            }
        }
        subscriber.onComplete();
    }
}

public class CollectionFlowable extends Flowable<Resource> {

    private final static Logger logger = LoggerFactory.getLogger(CollectionFlowable.class);
    private final MongoClient client;
    private final String databaseName;

    public CollectionFlowable(MongoClient client, String databaseName) {
        this.databaseName = databaseName;
        this.client = client;
    }


    @Override
    protected void subscribeActual(Subscriber<? super Resource> subscriber) {
        MongoDatabase database = client.getDatabase(databaseName);

        ListCollectionsIterable<Document> cursor = database.listCollections();
        MongoCursor<Document> iterator = cursor.iterator();

        while(iterator.hasNext()) {
            Document item = iterator.next();
            if (!item.isEmpty()) {
                logger.info(" ... found collection: {}.{}", database.getName(), item.getString("name"));
                Resource resource = new Resource(databaseName,
                        item.getString("name"),
                        (Document) item.get("options"));
                subscriber.onNext(resource);
            }
        }
        subscriber.onComplete();
    }
}

`

那是因为您没有正确遵循Flowable协议。 没有对subscriber.onSubscribe(...)调用,也没有遵守subscriber.request(...)规定的限制。

由于您的实现绝不会观察到背压,因此要么使用Flowable.create来创建缓冲版本,要么将实现移动到Observable ,而不是背压。

您看到的行为的原因是下游观察者没有请求任何项目,因此您对onNext的调用将被丢弃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM