-1

「リアクティブ」の理解が間違っていますか、それとも私の例に何か問題がありますか? 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));
    });
  }

OK、ブロックしていません。mongo を待っている間、何か他のことを計算できました。

しかし、どういうわけか、「リアクティブ」について考えたのは、RESTクライアントがmongo結果の最初のチャンクをすでに取得していても、mongoがまだその時までにすべてを見つける準備ができていないということです(HTTPストリーミング)。しかし、このように、mongo がすべての結果を見つけたときにコールバックが呼び出されます。

4

1 に答える 1

2

リアクティブはストリーミングとは異なります。リアクティブはデータ フローに関する概念であり、アプリケーションはイベントに反応します (例: mongoDB から返されたデータ)。ネットワークからデータが到着したらすぐにデータのポンピングを開始するように mongo クライアントに要求することで、その上にストリーミングを実装できるようになりました。ただし、ブロッキング API では、アプリケーションのデータをブロックすることでストリーミングを実行し、それを 1 つずつコンシューマーに渡すことができます。

于 2016-09-26T07:22:11.843 に答える