我有两个进程应该并行启动,如果第一个进程失败,我应该使用第二个进程结果.我想出了以下代码.有没有什么明智的方法来简化它?

final CompletableFuture<Data> mainFut = mainProcess(...);
final CompletableFuture<Data> backupFut = backupProcess(...);
final CompletableFuture<Data> resultFut = new CompletableFuture<>();
mainFut.handle((r, t) -> {
    if (t == null) {
        resultFut.complete(r); // main process is fine, use its result
    } else {
        LOGGER.error("Main process failed, using backup", t);
        backupFut.handle((rb, tb) -> {
            if (tb == null) {
                resultFut.complete(rb); //backup is fine, use its result
            } else {
                resultFut.completeExceptionally(tb); //backup failed too
            }
            return null;
        });
    }
    return null;
});
return resultFut;

推荐答案

您没有使用handle的结果,这将非常适合您的用例,例如

final CompletableFuture<Data> mainFut = mainProcess(...);
final CompletableFuture<Data> backupFut = backupProcess(...);

return mainFut.handle((r,t) -> t == null? r: backupFut.join());

如果您希望避免潜在的阻止join()呼叫,您可以使用

final CompletableFuture<Data> mainFut = mainProcess(...);
final CompletableFuture<Data> backupFut = backupProcess(...);

return mainFut.handle((r1, t1) -> t1 == null? mainFut: backupFut)
    .thenCompose(Function.identity());

备份操作的结果将取代主操作的异常,但当两者都失败时,您可以将原始异常包括在异常结果中,如下所示

return mainFut.handle((r1, t1) -> t1 == null? mainFut:
        backupFut.whenComplete((r2, t2) -> { if(t2 != null) t2.addSuppressed(t1); }))
    .thenCompose(Function.identity());

Java相关问答推荐

获取拦截器内部的IP地址

当列顺序更改时,Table View列列表的Change. wasPermanted()总是返回假

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

JVM会优化这个数学运算吗?

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

如何在EXCEL单元格中添加形状和文本

如何将其他属性引用到log4j2 yaml配置中?

如何使用log4j2(Json)记录由";异常引起的所有";?

是否为计划任务补偿系统睡眠?

是否在settings.xml中使用条件Maven镜像?

如何在Java中为thunk创建映射器函数

如果第一位数字和最后一位数字相差超过一位,您将如何获得随机数?

为什么相同的数据条码在视觉上看起来不同?

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

在JSON上获取反斜杠

java 11上出现DateTimeParseException,但java 8上没有