vertx:只有在获得所有内部调用的响应后才返回API的最终响应

时间:2017-08-21 04:33:08

标签: async-await vert.x

我在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中解决上述问题的最佳方法是什么?

1 个答案:

答案 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,你会有更清洁和更小的代码。