以下带有 Vert.x 的代码真的是反应式的吗?
Is the following code with Vert.x really reactive?
是我理解错了"reactive"还是我的例子有问题?
我在 Vertx 中做了一个小代码示例:在 REST 服务中,我从 mongodb 读取数据并返回为 JSON.
...........
Router router = Router.router(vertx);
router.route().handler(BodyHandler.create());
router.get("/gilders").handler(this::listAll);
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
}
private void listAll(RoutingContext routingContext) {
mongoClient.find("gliders", new JsonObject(), results -> {
List<JsonObject> objects = results.result();
/* is this non blocking?!
mongoClient.find return immediately, but the rest client just
gets results, after mongo delivered all results
*/
List<Glider> gilder = objects.stream()
.map(res -> {
Glider g = new Glider();
g.setName(res.getString("name"));
g.setPrice(res.getString("price"));
return g;
})
.collect(Collectors.toList());
routingContext.response()
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodePrettily(gilder));
});
}
好的,它没有阻塞,我可以在等待 mongo 的同时计算其他东西。
但不知何故,我想到 "reactive" 是 REST 客户端将已经获得 mongo 结果的第一块,即使 mongo 到那时还没有准备好找到所有结果( HTTP 流)。但是像这样,当 mongo 找到所有结果时,回调才被调用。
响应式与流式传输不同。 Reactive 是一个围绕数据流的概念,您的应用程序将对事件做出反应,例如:从 mongoDB 返回的数据。您现在可以通过要求 mongo 客户端在数据从网络到达时尽快开始抽取数据来在其之上实现流式传输。但是,在阻塞 API 中,您可以通过阻塞数据应用程序来进行流式传输,然后将其一个一个地传递给消费者。
是我理解错了"reactive"还是我的例子有问题? 我在 Vertx 中做了一个小代码示例:在 REST 服务中,我从 mongodb 读取数据并返回为 JSON.
...........
Router router = Router.router(vertx);
router.route().handler(BodyHandler.create());
router.get("/gilders").handler(this::listAll);
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
}
private void listAll(RoutingContext routingContext) {
mongoClient.find("gliders", new JsonObject(), results -> {
List<JsonObject> objects = results.result();
/* is this non blocking?!
mongoClient.find return immediately, but the rest client just
gets results, after mongo delivered all results
*/
List<Glider> gilder = objects.stream()
.map(res -> {
Glider g = new Glider();
g.setName(res.getString("name"));
g.setPrice(res.getString("price"));
return g;
})
.collect(Collectors.toList());
routingContext.response()
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodePrettily(gilder));
});
}
好的,它没有阻塞,我可以在等待 mongo 的同时计算其他东西。
但不知何故,我想到 "reactive" 是 REST 客户端将已经获得 mongo 结果的第一块,即使 mongo 到那时还没有准备好找到所有结果( HTTP 流)。但是像这样,当 mongo 找到所有结果时,回调才被调用。
响应式与流式传输不同。 Reactive 是一个围绕数据流的概念,您的应用程序将对事件做出反应,例如:从 mongoDB 返回的数据。您现在可以通过要求 mongo 客户端在数据从网络到达时尽快开始抽取数据来在其之上实现流式传输。但是,在阻塞 API 中,您可以通过阻塞数据应用程序来进行流式传输,然后将其一个一个地传递给消费者。