Java 在非阻塞I/O环境(如Vert.x 3)中使用morphia的正确方法

Java 在非阻塞I/O环境(如Vert.x 3)中使用morphia的正确方法,java,mongodb,morphia,vert.x,Java,Mongodb,Morphia,Vert.x,我目前正准备用Vert.X3实现(mongoDb的官方Java ORM),但看起来所有的查询和调用都是同步完成的,可以阻止Vert.X3的eventloop 如何将此查询转换为非阻塞代码集 DBObject query = BasicDBObjectBuilder.start() .add("albums", new BasicDBObject("$elemMatch",

我目前正准备用Vert.X3实现(mongoDb的官方Java ORM),但看起来所有的查询和调用都是同步完成的,可以阻止Vert.X3的eventloop

如何将此查询转换为非阻塞代码集

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();
DBObject query=basicdbobobjectbuilder.start()
.add(“相册”,
新的BasicDBObject($elemMatch),
新BasicDBObject(“$and”,新BasicDBObject[]{
新的BasicDBObject(“albumId”,albumDto.getAlbumId()),
新的BasicDBObject(“专辑”,
新的BasicDBObject(“$exists”,false))
})))
.get();
Query findQuery=datastore.createQuery(Artist.class,Query);
艺术家结果=findQuery.get();

如果要在Vert.x中使用同步代码,您有两个选项:

  • 使用工人垂直杆
  • executeBlocking
    closure中包装调用
工作线程垂直始终使用工作线程池中的线程执行。但是,如果您想混合使用异步和同步,您可能需要使用第二个选项。您可以阅读有关
executeBlocking
的所有信息。以您的示例为例,它将类似于:

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());
});

如果要在Vert.x中使用同步代码,您有2个选项:

  • 使用工人垂直杆
  • executeBlocking
    closure中包装调用
工作线程垂直始终使用工作线程池中的线程执行。但是,如果您想混合使用异步和同步,您可能需要使用第二个选项。您可以阅读有关
executeBlocking
的所有信息。以您的示例为例,它将类似于:

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());
});

太棒了,谢谢你。我使用了ExecutingBlock。如果你想完全异步,那么我建议看看mongo客户端,它使用mongodb异步驱动程序,但是你失去了ORM的功能:)听起来不错,不幸的是ORM目前对我来说太重要了。mongo客户端要求我编写更多的代码和JsonObject选项。非常感谢。我使用了ExecutingBlock。如果你想完全异步,那么我建议看看mongo客户端,它使用mongodb异步驱动程序,但是你失去了ORM的功能:)听起来不错,不幸的是ORM目前对我来说太重要了。mongo客户端要求我编写更多的代码和JsonObject选项。