【发布时间】:2022-11-04 21:32:06
【问题描述】:
在 Vert.x Web 服务器中,我有一组 Futures,每个 Futures 都可能失败或成功并保存一个结果。我对每一个 Future 的结果(可能还有结果)感兴趣,这意味着我需要处理每个 Future 的结果。
我在想 Vert.x 的 CompositeFuture 是要走的路,这是我的代码 sn-p:
List<Future> futures = dataProviders.stream()
.filter(dp -> dp.isActive(requester))
.map(DataProvider::getData)
.collect(Collectors.toList());
CompositeFuture.all(futures)
.onComplete(ar -> {
if(ar.failed()) {
routingContext.response()
.end(ar.cause());
return;
}
CompositeFuture cf = ar.result();
JsonArray data = new JsonArray();
for(int i = 0; i < cf.size(); i++) {
if(cf.failed(i)) {
final JsonObject errorJson = new JsonObject();
errorJson.put("error", cf.cause(i).getMessage());
data.add(errorJson);
} else {
data.add(((Data) cf.resultAt(i)).toJson());
}
}
JsonObject res = new JsonObject()
.put("data", data);
routingContext.response()
.putHeader("Content-Type", "application/json")
.end(res.toString());
});
但随之而来的是以下问题:
- 使用
CompositeFuture.all(futures).onComplete(),只要futures中的任何Future 失败(因为ar.result()为空),我就不会得到成功Future 的结果。 - 使用
CompositeFuture.any(futures).onComplete(),我会得到所有结果,但 CompositeFuture 会在futures的所有 Future 完成之前完成。意思是,它不会等待每个 Future 完成,而是在任何 Future 完成后立即完成。 (->cf.resultAt(i)返回空值) - 使用
CompositeFuture.join(futures).onComplete(),与all()相同:只要任何Future 失败,ar.result()就会为空。
等待 Futures 列表完成,同时能够单独处理每个结果和结果的正确/最佳方法是什么?
【问题讨论】:
标签: java asynchronous vert.x