我在vertx中编写API,需要多次调用下游系统。我希望只有在完成所有下游调用后才返回最终的api响应。但是由于vertx的高度异步性质,最终响应将在获得所有下游响应之前返回。
public void externalcall(RoutingContext routingContext) {
map<int, some_class> map = new hashmap();
for(int i=0; i<10; i++) {
some_class = internalcall(i);
map.put(i, some_class);
}
routingContext.response().putHeader("content-type", "application/json;
charset=utf-8").end(Json.encodePrettily(map));
}
在vertx中解决上述问题的最佳方法是什么?
答案 0 :(得分:3)
是的,你是对的,vert.x是异步的,所以你需要依赖期货或RX。
使用CompletableFuture
List<CompletableFuture> futuresList = new ArrayList<>();
for(int i=0; i<10; i++) {
futuresList.add(internalcall(i));
}
CompletableFuture
.allOf(futuresList.toArray(new CompletableFuture[futuresList.size()]))
.handle((res, ex) -> {
routingContext.response().putHeader("content-type", "application/json;charset=utf-8").end(Json.encodePrettily(futuresList));
return null;
});
只有在完成所有内部调用后才会执行handle
。您的internalcall
方法的返回类型应为CompletableFuture
public CompletableFuture<JsonObject> internalcall(int i) {
CompletableFuture<JsonObject> promise = new CompletableFuture<>();
someAsyncCall(i, res -> {
if(res.succeeded()){
promise.complete(res.result());
}else{
promise.completeExceptionally(new Exception(res.cause()));
}
});
return promise;
}
你可以使用RX,你会有更清洁和更小的代码。