gpt4 book ai didi

java - 如何使用FallbackFuture处理TimeoutException?

转载 作者:行者123 更新时间:2023-12-03 03:27:33 24 4
gpt4 key购买 nike

我有我的任务和后备方案:

ListenableFuture<T> listenableAsyncTask = executorService.submit(asyncTaskCallable);
ListenableFuture<T> listenableFallbackTask = executorService.submit(fallBackTaskCallable);

从他们那里,我形成了一个容错的 ListenableFuture:

ListenableFuture<T> failTolerantListenableFuture = Futures.withFallback(listenableAsyncTask, new FutureFallback<T>() {
@Override
public ListenableFuture<T> create(Throwable t) throws Exception {
return listenableFallbackTask;
}
});

我有一个容错 future 列表:

List<ListenableFuture<T>> listenableFutures = ...;

是时候得到结果了,在一定的时间内:

result = Futures.allAsList(listenableFutures).get(50,TimeUnit.MILLISECONDS);

此时,我预计如果任务未能在 50 毫秒内完成,返回输出将由fallBackTask 处理,这是一个轻量级任务。

但与我计划的不同,我遇到了以下异常:

java.util.concurrent.TimeoutException: Timeout waiting for task.

这导致我丢失其他成功任务的所有结果。在这种情况下,后备似乎对我不起作用。或者我误解了这个概念?

最佳答案

我们需要区分“Future 失败”和“对 Future.get 的调用失败。”

  • 如果您提交的任务抛出异常,则“Future 失败”。 (出于 withFallback 的目的,我们还认为取消是失败。不过,这与此无关,并且该行为有一天可能会改变。)
  • 如果发生以下任何情况,“对 Future.get 的调用将失败”:
    • future 失败了
    • 调用超时
    • 通话中断

withFallback 仅处理 Future 失败的情况,而不处理超时或中断的情况。

如果您的目标是检索 50 毫秒内完成的所有主要结果,而所有其他情况都回退到次要结果,您可以尝试类似的操作,它使用 withTimeout 自动在给定的超时后,Future 失败:

List<ListenableFuture<T>> originalFutures = ...;
List<ListenableFuture<T>> defaultAfterTimeoutFutures = new ArrayList<>();
for (ListenableFuture<T> f : originalFutures) {
f = Futures.withTimeout(f, 50, MILLISECONDS, executor);
f = Futures.withFallback(f, ...);
defaultAfterTimeoutFutures.add(f);
}
result = Futures.allAsList(defaultAfterTimeoutFutures).get();

但请注意,最后一个 get 调用可能等待超过 50 毫秒:如果主 Future 失败,则 get 调用必须等待直到其后备完成。如果您不想等待回退,那么您还需要使用 withTimeout 来包装它们。如果你确实包装它们,那么它们将在超时后失败,此时 allAsList 也会失败。如果您不希望这样,那么您需要使用 successfulAsList (而不是 allAsList)或再次使用 withFallback 包装包装器,这次的值总是立即可用。

关于java - 如何使用FallbackFuture处理TimeoutException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36575470/

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