2016-06-19 1 views
0

現在、morphia(mongoDbの公式Java ORM)をVert.x 3で実装しようとしていますが、すべてのクエリと呼び出しは同期して実行され、Vert.xのイベントループをブロックすることができます。Vertex 3のようなノンブロッキングI/O環境で適切な方法を使用する

このクエリを非ブロッキングコードセットにするにはどうすればよいですか。

DBObject query = BasicDBObjectBuilder.start() 
     .add("albums", 
         new BasicDBObject("$elemMatch", 
           new BasicDBObject("$and", new BasicDBObject[] { 
            new BasicDBObject("albumId", albumDto.getAlbumId()), 
            new BasicDBObject("album", 
             new BasicDBObject("$exists", false)) 
       }))) 
     .get(); 

Query<Artist> findQuery = datastore.createQuery(Artist.class, query); 
Artist result = findQuery.get(); 

答えて

2

あなたはVert.xで同期コードを使用する場合は、2つのオプションがあります:

  • 垂直方向の労働者を使用しexecuteBlocking閉鎖

Aにお電話をラップ作業員の頂点は常にワーカー・プールからのスレッドで実行されます。ただし、非同期と同期の両方を混在させたい場合は、おそらく2番目のオプションを使用します。 executeBlockinghereをすべて読むことができます。あなたの例を考えれば、それは次のようなものになります:

DBObject query = ... // your definition is probably non blocking 

vertx.executeBlocking(future -> { 
    // Call blocking API that takes a significant amount of time to return 
    Artist result = findQuery.get(); 
    future.complete(result); 
}, res -> { 
    System.out.println("The artist is: " + res.result()); 
}); 
+0

ありがとうございます。私はexecutionBlockingに行った。 –

+0

完全に非同期にしたいなら、mongodb-async-driverを使用するmongo-clientを見ることをお勧めしますが、ORMの機能は失われています:) –

+1

残念ながら、ORMはとても重要です瞬間。 mongo-clientは、もっと多くのコードとJsonObjectオプションを書く必要がありました。 –

関連する問題