Java 如何实现CompletableFuture.allOf(),在任何期货失败时异常完成?
我想实现Java 如何实现CompletableFuture.allOf(),在任何期货失败时异常完成?,java,completable-future,Java,Completable Future,我想实现CompletableFuture.allOf()和CompletableFuture.anyOf()的混合,其中返回的future在所有元素成功完成后立即成功完成,或者在任何元素异常完成后立即异常完成(具有相同的异常)。在多个元素失败的情况下,返回其中任何一个元素的异常就足够了 用例 我有一个任务需要聚合由CompletableFutures列表返回的子结果,但一旦其中任何一个失败,该任务就应该停止等待。我知道子任务将继续运行,这没关系 相关问题 我发现一开始似乎是一个重复的问题,但接
CompletableFuture.allOf()
和CompletableFuture.anyOf()
的混合,其中返回的future在所有元素成功完成后立即成功完成,或者在任何元素异常完成后立即异常完成(具有相同的异常)。在多个元素失败的情况下,返回其中任何一个元素的异常就足够了
用例
我有一个任务需要聚合由CompletableFuture
s列表返回的子结果,但一旦其中任何一个失败,该任务就应该停止等待。我知道子任务将继续运行,这没关系
相关问题
我发现一开始似乎是一个重复的问题,但接受的答案使用了
CompletionService
,它需要Callable
或Runnable
作为输入。我正在寻找一种将已经运行的CompletionStage
s作为输入的解决方案。我相信这将完成以下工作:
/**
* @param arrayOfFutures an array of futures to wait on
* @return a {@code CompletableFuture} that completes successfully once all elements have completed successfully, or completes
* exceptionally after any of the elements has done the same
* <br>{@code @throws NullPointerException} if {@code arrayOfFutures} is null
*/
public CompletableFuture<Void> waitForAllButAbortOnFirstException(CompletableFuture<?>... arrayOfFutures)
{
if (arrayOfFutures == null)
return CompletableFuture.failedFuture(new NullPointerException("arrayOfFutures may not be null"));
if (arrayOfFutures.length == 0)
return CompletableFuture.completedFuture(null);
return CompletableFuture.anyOf(arrayOfFutures).
thenApply(unused ->
{
// Remove any futures that completed normally and try again
return Arrays.stream(arrayOfFutures).
filter(element -> !element.isDone() || element.isCompletedExceptionally()).
toArray(CompletableFuture[]::new);
}).
thenCompose(remainingFutures -> waitForAllButAbortOnFirstException(remainingFutures));
}
/**
*@param arrayoffuture提供了一系列可供等待的未来
*@return一个{@code CompletableFuture},一旦所有元素成功完成,它就会成功完成,或者
*例外情况下,在任何元素完成相同操作之后
*
{@code@throws NullPointerException}如果{@code arrayOfFutures}为空
*/
public CompletableFuture waitForAllButAbortOnFirstException(CompletableFuture…arrayOfFutures)
{
if(arrayOfFutures==null)
返回CompletableFuture.failedFuture(新的NullPointerException(“arrayOfFutures可能不为null”);
if(arrayOfFutures.length==0)
返回CompletableFuture.completedFuture(空);
返回CompletableFuture.anyOf(arrayOfFutures)。
然后应用(未使用->
{
//删除所有正常完成的期货,然后重试
返回Arrays.stream(arrayOfFutures)。
过滤器(element->!element.isDone()| | element.isCompletedExceptionally())。
toArray(CompletableFuture[]::新建);
}).
然后撰写(remainingFutures->WaitForAllButtonFirstException(remainingFutures));
}
这个问题实际上与
虽然问题不完全相同,但相同的答案(来自我)应该能满足你的需求
您可以通过组合使用allOf()
来实现这一点,并使用excellective()
链接每个输入未来,这将使allOf()
返回的未来立即失败:
CompletableFuture<String> a = …, b = …, c = …;
CompletableFuture<Void> allWithFailFast = CompletableFuture.allOf(a, b, c);
Stream.of(a, b, c)
.forEach(f -> f.exceptionally(e -> {
allWithFailFast.completeExceptionally(e);
return null;
}));
CompletableFuture a=…,b=…,c=…;
CompletableFuture allWithFailFast=CompletableFuture.allOf(a、b、c);
(a、b、c)流
.forEach(f->f.forEach(e->{
除(e)外,所有故障均快速完成;
返回null;
}));
我看到,即使其中一个失败(比如我们的示例中的一个),其他两个仍然由executor服务接收。标记为失败的任务是否不会自动从线程池中删除?对于真正的fail fast u,必须取消f中的每个任务。例外情况下
确实,CompletableFuture
不提供任何机制来取消其背后的任务。这是因为它不包含对该任务的引用,实际上可能没有这样的具体任务,因为您可以通过编程方式创建一个CompletableFuture
。