在像 Vert.x 这样的非阻塞 I/O 环境中使用吗啡的正确方法 3

Proper way to use morphia in a non-blocking I/O environment like Vert.x 3

我目前正在尝试使用 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();

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

  • 使用 worker verticle
  • 将您的调用封装在 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());
});