-1
我有两个CompletionStage s。如果其中一个失败,我想执行一些操作,onException
。如果两者均失败,我想执行onException
,但只能执行一次。如何处理两个CompletionStages的最多一个例外
我有两个CompletionStage s。如果其中一个失败,我想执行一些操作,onException
。如果两者均失败,我想执行onException
,但只能执行一次。如何处理两个CompletionStages的最多一个例外
我找不到CompletableStage的方法来做到这一点,所以做了它自己:
public static <A, B> void handleEitherException(CompletionStage<A> a, CompletionStage<B> b, Consumer<Throwable> onException) {
AtomicBoolean aCompletionStageHasFailed = new AtomicBoolean();
handleEitherException(a, onException, aCompletionStageHasFailed);
handleEitherException(b, onException, aCompletionStageHasFailed);
}
private static <U> void handleEitherException(CompletionStage<U> u, Consumer<Throwable> onException, AtomicBoolean aCompletionStageHasFailed) {
u.handle((a, t) -> {
if (t != null) {
if (aCompletionStageHasFailed.compareAndSet(false, true)) {
onException.accept(t);
throw new RuntimeException(t);
}
}
return null;
});
}
```