如何在Vertx MongoClient中传输结果而不是全部读取内存?

时间:2017-11-22 11:23:26

标签: mongodb reactive-programming vert.x

Vertx是一个反应式框架。但是,它的MongoDB客户端API似乎没有被动反应。

要从集合中读取记录,我必须使用以下代码: -

mongo.find(COLLECTION, new JsonObject(), results -> {
  List<JsonObject> objects = results.result();
  objects.stream().map(...) //... do something with it
});

results.result()不会将完整的结果集提取到内存中吗?根据我的理解,它应该等我消耗数据而不是缓冲它。

在MongoDB自己的反应式驱动程序中,上面的代码应该是: -

mongoDb.getCollection(COLLECTION).find().subscribe(new Subscriber<Document>() {
    private Subscription subs;

            @Override
            public void onComplete() {
                // Do something
            }

            @Override
            public void onError(Throwable err) {
                // Handle it
            }

            @Override
            public void onNext(Document doc) {
                // Do something with the result doc
                subs.request(1);
            }

            @Override
            public void onSubscribe(Subscription subs) {
                this.subs = subs;
                subs.request(10);
            }
});

在上面的例子中,我没有使用任何缓冲区。我在Vertx的实现中缺少什么?

1 个答案:

答案 0 :(得分:0)

根据tsegismont的回答mongoClient.findBatch以及来自 RxJava BufferUntilSubscriber可能会产生相同的行为,请尝试以下代码段:< / p>

BufferUntilSubscriber<JsonObject> bufferedStream = BufferUntilSubscriber.create();

mongoClient.findBatch("COLLECTION NAME", new JsonObject(), savedDocuments -> {
    JsonObject result = savedDocuments.result();
    bufferedStream.onNext(result);
});

bufferedStream.subscribe(new Subscriber<JsonObject>() {
    @Override
    public void onStart() {
        request(1);
    }

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
    }

    @Override
    public void onNext(JsonObject document) {
        // do something with the emitted item "n"
        System.out.println(document);
        // request another item:
        request(1);
    }
});

这里唯一的问题是,request的{​​{1}}对Subscriber以上的请求不起作用,即使您试图说出1它最终会获取只有10结果。