java - CompletableFuture - 并行运行多个 rest 调用并获得不同的结果

标签 java multithreading spring-boot java-8 completable-future

我有一个相当普遍或独特的要求。例如,我有以下 AccountDetails 列表:List<AccountDetails>

class AccountDetails {
    String bankAccountId;
    String mortgageAccountId;
    Integer noOfTrans;
    String addressLine;
    String externalLink;   
}
上述所有字段,除了 bankAccountId 都是从外部 REST 服务调用中提取的。
我想并行调用所有 REST 服务并更新列表中的每个对象:
所以,它看起来像下面:
对于每个 accountDetails
  • 调用抵押 REST 服务并更新 martgageAccountId 字段(REST 返回 MortgageInfo 对象)
  • 调用事务 REST 服务并更新 noOfTrans 字段(REST 返回 Transactions 对象)
  • 调用地址 REST 服务并更新 addressLine 字段(REST 返回 Address 对象)
  • 调用链接 REST 服务并更新 externalLink 字段。 (REST 返回 Links 对象)

  • 我希望并行执行上述所有调用,并针对列表中的每个 AcccountDetails 对象。
    如果有异常,我想优雅地处理它。请注意,上述每个 REST 服务都返回不同的自定义对象
    我对如何使用 CompletableFuture 链接实现这一目标感到困惑。
    不确定 allOfthenCombine(只需要两个),或者 thenCompose 应该使用以及如何将所有这些放在一起。
    任何例子/想法?

    最佳答案

    AccountDetails accountDetails = new AccountDetails();
    
    CompletableFuture.allOf(
                            CompletableFuture.
                                    supplyAsync(() -> //CALL MORTAGE INFO REST, executor).
                                    thenAccept(x -> {
                                        accountDetails.setMortgageAccountId(x.getReqdField())
                                    }).
                                    handle(//HANDLE GRACEFULLY),
                            CompletableFuture.
                                    supplyAsync(() -> //CALL SOME OTHER REST, executor).
                                    thenAccept(x -> {
                                        accountDetails.setNoOfTrans(x.getReqdField())
                                    }).
                                    handle(//HANDLE GRACEFULLY),
                            CompletableFuture.
                                    supplyAsync(() -> //CALL SOME INFO REST, executor).
                                    thenAccept(x -> {
                                        accountDetails.setAddressLine(x.getReqdField())
                                    }).
                                    handle(//HANDLE GRACEFULLY),
                            CompletableFuture.
                                    supplyAsync(() -> //CALL SOME OTHER REST, executor).
                                    thenAccept(x -> {
                                        accountDetails.setExternalLink(x.getReqdField())
                                    }).
                                    handle(//HANDLE GRACEFULLY),
                    ).join();
    

    关于java - CompletableFuture - 并行运行多个 rest 调用并获得不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62839608/

    相关文章:

    python - 从线程目标访问 `self`

    spring - 为用户 Keycloak Admin Client 分配角色

    java - LIBGDX 加速整个游戏(使用 box2d)

    c++ - 尝试将整数强制转换为 void 以按值传递给 pthread 函数

    java - 如何在 JTable 顶部添加新行并更改 Java 中新插入行的颜色?

    C# - 在控制台中显示倒计时器以通过 ReadLine() 进行用户输入

    spring - 无法访问spring boot应用程序模板文件夹中的html文件

    java - 在 Spring boot 应用程序中使用 Filter 修改 ServletRequest

    java - 我想从 firestore 检索当前登录的用户数据,但它在我想显示数据的地方显示空白

    java - 将 JavaFX TextField 绑定(bind)到来自两个 SimpleStringValues 的字符串值