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