2017-04-11 6 views
0

휴식 전화를 보내기 위해 봄 AsyncRestTemplate을 사용하는 서비스가 있습니다. AsyncRestTemplate.exchange()의 각 호출은 ListenableFuture을 반환합니다. 이런 식으로 뭔가 :봄을 기다리십시오 ListenableFuture

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

다른 모든 통화를 결합하여 하나의 ListenableFuture을 만들 수있는 방법이 있습니까? Guava의 Futures.allAsList과 같은 것입니다.

+3

가장 좋은 방법은 같은 어댑터를 사용하는 것입니다 전화 이 하나 : Spring 5의 [Future Converter] (https://github.com/lukas-krecan/future-converter) –

답변

1

1 단계 : 변환 CompletableFuture 각 ListenableFuture

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

단계 # 2 : CompletableFuture.allOf (CF1, CF2, CF3을 ...)

+1

거기에 org.springframework.util.concurrent.ListenableFuture가 있습니다. # 동일한 메소드를 수행하는 완료 가능한 메소드. – destan