当前位置: 首页 > 知识库问答 >
问题:

从CompletableFuture.AllOf()中获取单个结果

刘和玉
2023-03-14

我有一个类,它使用CompletableFutures向两个依赖的服务发出并发请求

我的代码如下所示:

@Builder
@Slf4j
public class TestClass {

    @NonNull private final ExecutorService threadPool = Executors.newFixedThreadPool(2);
    @NonNull private final dependency1Client;
    @NonNull private final dependency2Client;

    public void myMethod() {

        RequestObject1 firstDependencyRequest = RequestObject1.builder()
                .attribute1("someValue")
                .attribute2("secondValue");

        CompletableFuture<ResultStructure1> future1 = CompletableFuture.supplyAsync(() -> dependency1Client.call(firstDependencyRequest), threadPool);
        RequestObject2 secondDependencyRequest = RequestObject2.builder()
                .attribute1("someValue")
                .attribute2("secondValue");

        CompletableFuture<ResultStructure2> future2 = CompletableFuture.supplyAsync(() -> dependency2Client.call(secondDependencyRequest), threadPool);

        try {
            CompletableFuture finalFuture = CompletableFuture.allOf(future1, future2);

        } catch (ExecutionException|InterruptedException e) {
            log.error("Exception calling dependency", e);
            throw new RuntimeException(e);
        }
    }
}

我需要两次调用相关服务的结果。如何在不执行阻塞调用的情况下获取它们?我最初想做future1.get(),但这是一个阻塞调用,我必须等到第一个API调用的结果出来。

有没有一种方法可以从两个调用中获得结果?

共有1个答案

邵昆琦
2023-03-14

正如completablefuture.allof()的JavaDoc所指出的:

否则,给定CompletableFutures的结果(如果有的话)不会反映在返回的CompletableFutures中,而是可以通过单独检查它们来获得。

这意味着您必须对它们调用join()get()。如果您在allof()之后的链中这样做,它将不会阻塞,因为它已经保证了所有这些操作都已经完成。

请注意,在您的特定情况下,如果您只有两个Future,那么使用thencombine()可能更简单,它使您更容易地访问两个结果。

 类似资料:
  • 问题内容: 考虑这个SQL查询 该查询将仅在字段中返回一个值。 有没有一种方法可以在不使用a并指向返回数组的第一个值的情况下获取该值? 问题答案: 将允许您直接从结果集中提取值,而不必使用 提取 方法。这是一个非常简单的示例,说明如何使用它来获取单个值: 该函数有三个参数。第一个是结果集本身,第二个是行索引,第三个是字段索引。我只使用前两个参数,因为第三个参数默认为0,即返回第一个字段。

  • 我正在使用hibernate 4和Spring 3。 我有5个表,每个表映射一个实体类。现在,如果我必须从1个表中选择列,我将执行以下操作: 此结果中的此值将为EmployeeEntity类型。 或者我也可以使用标准。 现在我的要求是我必须从所有5个表中得到结果。每个表中有1-2列。 早些时候,它是一个1表,所以我得到了一个实体,现在我得到了5个表的结果,所以如何在实体中映射它。 List res

  • 嗨,所以经过一些搜索仍然没有找到答案,但我想要得到一个网页的单个元素到一个字符串变量。我知道如何在C语言中实现这一点,但我想知道如何在java语言中实现这一点 例如: 谢谢 我需要将该值从网页中转换成一个字符串变量

  • 问题内容: 到目前为止,我们有一个项目结构,其中包含名为的单个源文件夹,其中包含三个模块的源代码。我想做的是: 1)编译源代码。这可以通过sourceSets定义轻松完成: 2)将编译结果放入三个jar中。我通过三个“ jar”类型的任务来做到这一点: 我现在通过三个单独的任务来执行此操作: util.jar } client.jar } server.jar } 问题是应该包含and 中不包含的

  • 问题内容: 我有dbo.Users表 然后我有dbo.Phones表 然后我有dbo.Relationship表 我如何进行查询返回 这就是我到目前为止所得到的。 问题答案: 在这里,将“关系”表视为“用户”和“电话”表之间的中间人。它与映射表是多对多关系。将您的用户加入到关系中,然后将其加入到您的电话中。 可以这样想: 用户: 您好关系,我的UserId = 1,我对那个UserId有什么电话I

  • 你能帮我弄清楚为什么这个查询不返回结果吗? 我使用ogr2ogr导入了一个形状文件将其转换为GeoJson,然后使用以下命令将其导入到Mongo:“mongoimport--db ht--集合设施 下面是一个示例文档,以及未返回任何内容的查询和索引: 以下是文档(为简洁起见删除了属性): } 这是索引。我尝试了“geometry”和“geometry.coordinates”,结果相同: }