Waiting for callback for multiple futuresから適応。
この例では、Google と Microsoft のホームページを単にリクエストしています。コールバックで応答が受信され、処理が完了したら、CountDownLatchをデクリメントします。CountDownLatch を待機し、CountDownLatch が 0 になるまで現在のスレッドを「ブロック」します。
メソッドを続行するには 0 をヒットする必要があるため、呼び出しが失敗または成功した場合にデクリメントすることが重要です。
public static void main(String[] args) throws Exception {
String googleUrl = "http://www.google.com";
String microsoftUrl = "http://www.microsoft.com";
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
ListenableFuture<ResponseEntity<String>> googleFuture = asyncRestTemplate.exchange(googleUrl, HttpMethod.GET, null, String.class);
ListenableFuture<ResponseEntity<String>> microsoftFuture = asyncRestTemplate.exchange(microsoftUrl, HttpMethod.GET, null, String.class);
final CountDownLatch countDownLatch = new CountDownLatch(2);
ListenableFutureCallback<ResponseEntity<java.lang.String>> listenableFutureCallback = new ListenableFutureCallback<ResponseEntity<String>>() {
public void onSuccess(ResponseEntity<String> stringResponseEntity) {
System.out.println(String.format("[Thread %d] Status Code: %d. Body size: %d",
Thread.currentThread().getId(),
stringResponseEntity.getStatusCode().value(),
stringResponseEntity.getBody().length()
));
countDownLatch.countDown();
}
public void onFailure(Throwable throwable) {
System.err.println(throwable.getMessage());
countDownLatch.countDown();
}
};
googleFuture.addCallback(listenableFutureCallback);
microsoftFuture.addCallback(listenableFutureCallback);
System.out.println(String.format("[Thread %d] This line executed immediately.", Thread.currentThread().getId()));
countDownLatch.await();
System.out.println(String.format("[Thread %d] All responses received.", Thread.currentThread().getId()));
}
私のコンソールからの出力:
[Thread 1] This line executed immediately.
[Thread 14] Status Code: 200. Body size: 112654
[Thread 13] Status Code: 200. Body size: 19087
[Thread 1] All responses received.