2016-09-24 5 views
-1

私は「反応性」を間違って理解していますか、私の例では間違っていますか? Vertxで小さなコードサンプルを作成しました.RESTサービスでは、mongodbからデータを読み取り、JSONとして返します。次のVert.xのコードは本当に反応しますか?

........... 
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がすべての結果を見つけたときに呼び出されます。

答えて

1

反応性はストリーミングと同じではありません。 Reactiveはデータフローに関するコンセプトです。アプリケーションはイベントに反応します(例:mongoDBから返されたデータ)。これで、mongoクライアントに、ネットワークから到着したときにできるだけ早くデータをポンピングするように要求することで、ストリーミングを実装することができます。しかし、ブロッキングAPIでは、アプリケーションのデータをブロックしてストリーミングを行い、それを1つずつコンシューマに渡すことができます。

+1

私はすでに気づいたdownvoteに、これは一種の愚かな質問だった。しかし、私は馬鹿なままでいるよりも愚かな質問をする方が良いと思った – midnight

関連する問題