vert.x - Vertx:未来的结果可用性和编码模式
问题描述
我在理解 Vertx 异步模型以及Future
行为方式方面存在一些问题......
在我的应用程序的启动代码中,我检查了一些条件,例如 db 访问和其他凭据,然后在启动应用程序的核心之前启动了几个管理 verticle(config verticle、http admin verticle 等)。该代码具有以下结构:
Vertx vertx = null;
Vertx.clusteredVertx(opts, ar -> {
if(ar.failed()) {
System.exit(-1);
}
else {
vertx = ar.result();
Future<Void> f1 = asyncStartupFunction_1(...);
if(f1.failed()) {
System.exit(-1);
}
else { // f1 succeeded
Future<Void> f2 = asyncStartupFunction_2(...);
if(f2.failed()) {
System.exit(-1);
}
else { // f2 succeeded
...
} // f2 succeeded
} // f1 succeeded
} // vertx creation OK
asyncStartupFunction_x
做一些异步工作(查询一个数据库或部署一个垂直),然后他们返回Future
代表这项工作的结果。
我会以为一旦我在一个else
街区,相应的未来就成功了。有没有可能工作还没有完成,对应的未来还没有完成?因此,因为我(在我的理解中)我不应该fx.failed() == false
到达 街区?else
什么是正确的模式?
解决方案
asyncStartupFunction_1
返回 aFuture
并且不能保证 future 在此时完成。
因此f1.failed()
很有可能不会给你一个正确的结果。这不是阻塞调用,它可能false
只是因为未来尚未完成而返回。
您需要的是异步协调。根据您的需要,您可以并行或顺序执行异步作业。
推荐阅读
- python - 将具有相同大小和索引的数据帧相乘
- python - 如何删除字符串中的字母
- gnu-make - 如何根据条件的输出执行不同的配方?
- angular - Angular8 PrimeNG 反应形式的下拉菜单 - 初始值
- bash - 如何从bash中的随机子域中检索主域
- java - 无法使用特定配置文件运行 Spring Boot JAR 文件
- latex - 如何删除长表中的特定垂直线
- angular - 听 Angular 事件点击 webbrowser
- ruby-on-rails - 如何为在 Rails 5 中调用邮件程序的方法编写 rspec 模拟
- javascript - React.js 路由确切路径不正常