Является ли следующий код с Vert.x действительно реактивным?
У меня неправильное понимание "реактивного" или что-то не так в моем примере? Я сделал небольшой пример кода в 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));
});
}
Хорошо, это не блокировка, я мог бы вычислить что-то еще, ожидая монго.
Но почему-то я подумал о "реактивном": клиент REST получит уже первые куски результатов монго, даже если монго еще не готово найти все к этому времени (HTTP Streaming). Но, как это, обратный вызов просто вызывается, когда Монго нашел все результаты.
1 ответ
Реактив это не то же самое, что потоковое. Reactive - это концепция потоков данных, ваше приложение будет реагировать на события, например, данные, возвращаемые из mongoDB. Теперь вы можете реализовать потоковую передачу поверх него, попросив клиента mongo начать перекачку данных как можно скорее, когда они поступают из сети. Однако в блокирующем API вы можете выполнять потоковую передачу, блокируя приложение для данных, а затем передавать его одному за другим потребителю.