2017-08-21 3 views
0

Ich schreibe eine API in Vertex, die ein Downstream-System benötigt, um mehrfach aufgerufen zu werden. Ich möchte, dass die endgültige API-Antwort erst zurückgegeben wird, nachdem alle Downstream-Aufrufe abgeschlossen sind. aber wegen der hoch asynchronen Natur von Vertex wird die letzte Antwort zurückgegeben, bevor alle nachfolgenden Antworten erhalten werden.vertx: Zurückgeben der endgültigen Antwort der API erst nach Erhalt der Antwort aller internen Aufrufe

Was ist der beste Weg, um oben genannten Problem in Vertex anzugehen?

Antwort

3

Ja, Sie haben Recht, vert.x ist asynchron, also müssen Sie sich auf Futures oder RX verlassen.

Mit 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; 
}); 

Die handle wird nur ausgeführt werden, wenn alle internen Anrufe fertig sind. Ihr Rückgabetyp internalcall Methode sollte

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; 
} 

CompletableFuture Sie sich mit RX gehen können, werden Sie viel sauberer und kleineren Code.

Verwandte Themen