在 Vert.x Web 服務器中,我有一組 Futures,每個 Futures 都可能失敗或成功并保存一個結果。我對每一個 Future 的結果(可能還有結果)感興趣,這意味著我需要處理每個 Future 的結果。
我在想 Vert.xCompositeFuture是要走的路,這是我的代碼片段:
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(),一旦任何 Futurefutures失敗(因為 thenar.result()為空),我就不會得到成功的 Future 的結果。 - 使用
CompositeFuture.any(futures).onComplete(),我會得到所有結果,但是 CompositeFuture 在所有 Futures 完成之前futures完成。意思是,它不會等待每個 Future 完成,而是在任何 Future 完成后立即完成。(->cf.resultAt(i)回傳空值) - 使用, 與:
CompositeFuture.join(futures).onComplete()相同,只要任何 Future 失敗,它就為 null。all()ar.result()
等待 Futures 串列完成,同時能夠單獨處理每個結果和結果的正確/最佳方法是什么?
uj5u.com熱心網友回復:
最簡單的方法是您自己處理結果。您可以將onSuccess處理程式注冊到您的期貨。這樣,結果將被放入某種串列中,例如JsonArray.
List<Future> futures = //...list of futures
JsonArray results = new JsonArray();
futures.forEach(e -> e.onSuccess(h -> results.add(h)));
CompositeFuture.all(futures)
.onComplete(ar -> {
if(ar.failed()) {
// successful elements are present in "results"
routingContext.response().end(results.encode());
return;
}
//... rest of your code
});
你也可以去rx-java圖書館看看。使用它通常可以更好地實作此類用例。
uj5u.com熱心網友回復:
使用時,您可以簡單地戳原始期貨的結果all:
List<Future> futures = //...list of futures
CompositeFuture.all(futures).onComplete(ar -> {
if(ar.succeeded()){
futures.forEach(fut -> log.info( fut.succeded() " / " _fut.result() ));
}
} );
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462289.html
上一篇:更新變數異步等待
下一篇:如何處理if條件中的異步呼叫
