2017-08-21 6 views
0

私は、下流システムを複数回呼び出す必要があるAPIをvertxで作成しています。すべての下流呼び出しが完了した後にのみ、最終的なAPI応答を返すようにします。頂点の非同期性が非常に高いため、すべてのダウンストリーム応答を取得する前に最終的な応答が返されます。vertx:すべての内部呼び出しの応答を取得した後にのみ、APIの最終応答を返します。

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問題を解決するには、どのような方法がありますか?

答えて

3

はい、正しいです、vert.xは非同期なので、先物やRXに依存する必要があります。内部コールの全てが完了したときにhandleにのみ実行されます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; 
}); 

を使用して

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で行くことができ、あなたは非常にきれいで小さなコードがありますする必要があります。

関連する問題