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

标签 java mongodb morphia vert.x

我目前正在努力实现 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/

相关文章:

Java 反射 : How do I override or generate methods at runtime?

java - 在 jpanel 上绘制字符串

mongodb - 仅在 MongoDB 日志中记录错误

mongodb 不为 $exists 和 $elemMatch 使用索引

java - 嵌入列表中的 Morphia 查询

java - 将 twitter4J 状态保存到 MongoDB 会给出 "twitter4j.Status is an interface, and JAXB can' t 句柄接口(interface)”

unmarshalling - 使用 Morphia 存储多维数组

java - Slick2D 使用光标键平滑地移动对象

java - 我可以在使用 Cordova 的 iOS 应用程序中使用 Java 库吗?

node.js - 在 Mongoose 中迭代集合的最简单方法