Vert.x的以下代码是否真的有反应?

时间:2016-09-24 12:23:00

标签: mongodb java-8 vert.x 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的同时计算其他东西。

但不知怎的,我想到了&#34;反应&#34;是REST客户端已经获得了mongo结果的第一块,即使mongo还没有准备好在那个时候找到所有(HTTP Streaming)。但是像这样,当mongo找到所有结果时,就会调用回调。

1 个答案:

答案 0 :(得分:1)

Reactive与流式传输不同。 Reactive是一个围绕数据流的概念,您的应用程序将对事件做出反应,例如:从mongoDB返回的数据。您现在可以通过要求mongo客户端在从网络到达时尽快开始抽取数据来实现流式传输。但是,在阻止API中,您可以通过阻止数据应用程序进行流式处理,然后将其逐个传递给使用者。