2

有一项服务使用 SpringAsyncRestTemplate发送休息呼叫。每次调用AsyncRestTemplate.exchange()返回ListenableFuture。像这样的东西:

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

有没有办法创建一个ListenableFuture结合所有其他调用的单曲?像Futures.allAsList番石榴的东西。

4

2 回答 2

3

第 1 步:将每个 ListenableFuture 转换为 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;
}

步骤#2:调用 CompletableFuture.allOf(cF1, cF2, cF3...)

于 2017-06-17T08:21:41.700 回答
2

从 Spring 5.0 开始,ListenableFuture实现了completable()完全符合您需要的方法:

    /**
     * Expose this {@link ListenableFuture} as a JDK {@link CompletableFuture}.
     * @since 5.0
     */
    default CompletableFuture<T> completable() {
于 2019-12-16T16:04:50.953 回答