我目前正在努力用Vert.x 3实现morphia(mongoDb的官方Java ORM),但看起来所有查询和调用都是同步完成的并且可以阻止Vert.x 3的事件循环
如何将此查询转换为非阻塞代码集。
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();
答案 0 :(得分:2)
如果要在Vert.x中使用同步代码,则有2个选项:
executeBlocking
关闭始终使用工作池中的线程执行工作者Verticle。但是,如果要混合使用异步和同步,则可能需要使用第二个选项。您可以阅读有关executeBlocking
here的所有信息。举个例子,它就像是:
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());
});