0

私はオブジェクトXを構築していますが、それを構築するために必要なすべてのデータを取得するためにいくつかのhttp呼び出しを行う必要があります(それぞれの残りはオブジェクトの特定の部分を埋めます)保持するためにパフォーマンスが高い 呼び出しを非同期にして、すべての呼び出しが完了したらオブジェクトを呼び出し元に返すとよいと思いました。こんな感じです

ListenableFuture<ResponseEntity<String>> future1 = asycTemp.exchange(url, method, requestEntity, responseType);
future1.addCallback({
    //process response and set fields
    complexObject.field1 = "PARSERD RESPONSE"
},{
    //in case of fail fill default or take some ather actions
})

すべての機能が完了するのを待つ方法がわかりません。この種の問題を解決するための標準的な春の方法だと思います。ご提案いただきありがとうございます。春バージョン - 4.2.4.RELEASE よろしくお願いします

4

1 に答える 1

2

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.
于 2016-02-05T20:46:18.747 に答える