gpt4 book ai didi

java - 如何将 DeferredResult 与 ListenableFuture 列表结合使用?

转载 作者:行者123 更新时间:2023-12-05 07:46:19 25 4
gpt4 key购买 nike

我有一个 Guava ListenableFuture 实例和 Spring DeferredResult 的列表。我想为列表中第一个成功的 future 设置结果,或者如果超时尚未到期以从所有 future 中获得成功的结果。这是我的尝试:

DeferredResult<String> foo() {
DeferredResult<String> result = new DeferredResult<>(3000L);

List<String> resps = newArrayList();
List<ListenableFuture<String>> fList = ...

fList.forEach(f -> Futures.addCallback(f, new FutureCallback<String>() {
@Override
public void onSuccess(String resp) {
resps.add(resp);
}

@Override
public void onFailure(Throwable t) {
// NOP
}
}));

ListenableFuture<List<String>> f0 = Futures.successfulAsList(fList);

Futures.addCallback(f0, new FutureCallback<List<String>>() {
@Override
public void onSuccess(List<String> r) {
if (!result.hasResult()) {
result.
if (r != null) {
result.setResult(...);
}
}
}

@Override
public void onFailure(Throwable t) {
// NOP
}
});

return result;
}

我的代码不起作用,因为它等待所有 future 的结果,但我需要关于 DeferredResult 超时的最快结果。我该如何解决?

最佳答案

DeferredResult<String> foo() {
DeferredResult<String> result = new DeferredResult<>(3000L);

List<ListenableFuture<String>> fList = ...

ExecutorService serializingExecutor = Executors.newSingleThreadExecutor();
fList.forEach(
f ->
Futures.addCallback(
f,
new FutureCallback<String>() {
@Override
public void onSuccess(String value) {
if (!result.hasResult()) {
result.setResult(value);
}
}

@Override
public void onFailure(Throwable throwable) {}
},
// To avoid race in the callback:
serializingExecutor));

return result;
}

关于java - 如何将 DeferredResult 与 ListenableFuture 列表结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40871456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com