vert.x - vertx中的同步调用
问题描述
我们尝试将我们的项目从 servlet 重构为 vertx3.x。我们希望重用DAO
负责查询数据的层:
interace Adapter {
List<Feature> query(String layer);
}
class DataBaseAdapter implements Adapter {
}
class FileAdapter implements Adapter {
}
class HttpVertx extends AbstractVertx {
void start() {
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.route().handler((h->{
List<Feature> r=new ArrayList();
String[] layers=getLayerFromRequest(h.request());
layers.forEach(l->{
h.vertx().executeBlocking(future->{
future.complete(getAdapter(l).query(l));
},false,res->{
List<Feature> data=res.result();
r.addAll(data);
//now how can I know that the loop have ended, and I can send the `r` to the client?
});
});
}));
server.requestHandler(router::accept).listen(8080);
}
Adapter getAdapter(String layer){
//return database or file adapter accordingly
return null;
}
}
如图,原来的adapter
查询都是块操作,一旦我循环执行,不知道什么时候都完成了。
此外,我不确定是否有必要重构DatabaseAdapter
使用vertx-jdbc
? 如果是,我将不得不将 Adapter
接口的方法签名更改为同步,但FileAdapter
不支持。
什么是正确的重构解决方案?
解决方案
尝试将循环逻辑移动到
executeBlocking
块中并将处理程序类型更改为Handler<List<Feature>>
不,这不是绝对必要的,因为包装这些调用
executeBlocking
已经在为 Verticle 的工作池进行数据库交互的昂贵工作。
推荐阅读
- python - 如何从python中的文本中删除字体
- python - Sklearn StackingClassifier:将特征作为输入添加到最终估计器
- python - 将参数传递给线程。参数源自 tkinter GUI 中的输入
- c - 为什么C语言中的函数return是一个语句?
- python-3.x - 使用 Pandas 的 csv 文件中的列名和排序数据
- c++ - 将指向成员函数的指针传递给单独的线程
- flutter - Flutter 命令卡在等待启动锁
- reactjs - 刷新访问令牌并调用转发(操作)后不重新执行查询
- node.js - 使用 Node.js 和命令提示符更新了 Discord Bot 问题
- c# - 有什么方法可以知道方法中是否正在等待正在运行的方法?