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

时间:2016-06-19 00:46:30

标签: java mongodb morphia vert.x

我目前正在努力用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();

1 个答案:

答案 0 :(得分:2)

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

  • 使用工作者Verticle
  • 将您的来电换入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());
});