我目前正在努力实现 morphia (mongoDb 的官方 Java ORM)与 Vert.x 3 但看起来所有查询和调用都是同步完成的,并且可以阻止 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();
最佳答案
如果您想在 Vert.x 中使用同步代码,您有 2 个选择:
- 使用工作线程
- 将您的调用封装在
executeBlocking
闭包中
worker verticle 始终使用 worker 池中的线程执行。但是,如果您想混合异步和同步,您可能需要使用第二个选项。您可以阅读有关 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());
});
关于java - 在 Vert.x 3 这样的非阻塞 I/O 环境中使用吗啡的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902949/