我对理解Vertx异步模型以及Future
的行为有一些疑问...
在我的应用程序的启动代码中,我检查了一些条件,例如数据库访问和其他凭据,然后在启动应用程序核心之前启动了多个管理版本(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
的那段时间(据我所知)不是?
什么是正确的模式?
答案 0 :(得分:3)
asyncStartupFunction_1
返回一个Future
,并且不能保证将来会完成。
因此,f1.failed()
很有可能无法给出正确的结果。这不是阻塞呼叫,它可能仅由于将来尚未完成而返回false
。
您需要的是async coordination。根据需要,您可以并行或顺序执行异步作业。