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的实现中缺少什么?
答案 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
结果。