2017-04-11 4 views
0

Es gibt einen Dienst, der Spring AsyncRestTemplate zum Senden von Ruheaufrufen verwendet. Jeder Anruf von AsyncRestTemplate.exchange() gibt ListenableFuture zurück. Etwas wie folgt aus:Warten auf einige Frühling ListenableFuture

ListenableFuture future1 = new AsyncRestTemplate().exchange(...); 
    ListenableFuture future2 = new AsyncRestTemplate().exchange(...); 
    ListenableFuture future3 = new AsyncRestTemplate().exchange(...); 

Gibt es eine Möglichkeit für einzelne ListenableFuture zu schaffen, die alle anderen Anrufe kombiniert? Etwas wie Futures.allAsList von Guava.

+3

Ihre beste Wette wie anrufen, um einen Adapter zu verwenden ist dieses: [Future Converter] (https://github.com/lukas-krecan/future-converter) –

Antwort

1

Schritt # 1: jeder ListenableFuture konvertieren

CompletableFuture
public CompletableFuture<T> toCompletableFuture(ListenableFuture<ResponseEntity<String>> listenableFuture) { 
    final CompletableFuture<T> completableFuture = new CompletableFuture<>(); 

    listenableFuture.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() { 
     @Override 
     public void onFailure(Throwable e) { 
      completableFuture.completeExceptionally(e); 
      } 
     } 

     @Override 
     public void onSuccess(ResponseEntity<String> result) { 
      completableFuture.complete(parseResponse(result)); 
      } 
     } 
    }); 
    return completableFuture; 
} 

Schritt # 2: CompletableFuture.allOf (CF1, CF2, cF3 ...)

+1

im Frühjahr 5 gibt es org.springframework.util.concurrent.ListenableFuture # completetable Methode, die das gleiche tut. – destan