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

如何在CompletableFuture中访问前一阶段的结果

蒋星雨
2023-03-14

我正在尝试将任务链接到CompletableFuture中,以并行执行它们并获得最佳性能和资源利用率。

我正在编写的工作流有五个阶段,每个阶段取决于前几个阶段的结果。

工作流执行如下:

* Stage-1: Create CustomerContext -> This will call downstream services and return Context object.
    
* Stage-2: Generate Candidates for the customer -> This stage generate candidates and returns a List<Candidate> object. This stage requires CustomerContext as a parameter to generate the candidates. 
    
* Stage-3: Process Candidate -> In this stage I process the candidates and returns processed List<Candidate>. This stage requires CustomerContext and List<Candidate> object from stage-1 and stage-2 
    
* Stage-4: Rank candidates -> In this stage I perform candidate ranking and returns ranked List<Candidate> object. This stage requires CustomerContext and List<Candidate> object from stage-1 and **stage-3** 
      
* Stage-5: Generate Result -> In this stage I generate the final result and returns Result object by making downstream API calls., This stage requires CustomerContext and List<Candidate> object from **stage-1** and **stage-4** 

我可以创建一个结果持有器对象来保存每个阶段的结果。但是,我不确定这是否是最好的解决方案。

CompletableFuture是此用例的最佳解决方案吗?链接这些阶段的最佳方式是什么?

共有1个答案

冀望
2023-03-14

使用thenCompose组合来自相互依赖的不同期货的结果:

CompletableFuture<String> result =
    CompletableFuture.supplyAsync(() -> "result 1")
        .thenCompose(result1 ->
    CompletableFuture.supplyAsync(result1::length)
        .thenCompose(strLen ->
    CompletableFuture.supplyAsync(strLen::toString)));

但请注意,由于每个未来都依赖于前一个未来的结果,因此无法并行执行它们。每个未来仍将在上一个完成后执行。如果期货不相互依赖,您可以通过“挖掘隐藏的应用”来并行运行它们。

还要注意的是,CompletableFuture只有supplyAsyncrunAsync分别接受供应商可运行,并且没有直接方法处理可能引发异常的异步操作(例如运行调用)。如果您需要这样做,您必须按照本答案中的描述,将其委托给未来的助手。

 类似资料:
  • 我这里有两个集合: } 和 “设备”集合中的访客日志是指第二个集合,即访客日志。 我需要找到每个目的访问次数最多的单位。 我在mongo shell中尝试过: 我得到以下结果: 这意味着,例如,编号为05in12in2的单位的访问量最大,其目的是“业务” 我现在想获得05in12in2的“商务”访问次数。我认为它在第一个小组阶段的“计数”变量中。 我如何访问它?我在倒数第二个阶段尝试了,即在限制阶

  • 我怎么绕过这个?我需要以某种方式再次实现那个方法,但突然间我不能通过作为一个论点的阶段。

  • 我有一个主要的场景,在那里我保留了所有的木鬼。它有一个菜单,打开新的场景,在那里我有一些设置: 这个eventLog文本区是我放置所有日志的地方,比如应用程序启动、设置更改、项目保存等。我正在用openProjectWindow void打开新场景,并且我正在将这些信息添加到我的日志记录程序中。我的新窗口是一个单独的类: 完成后,我需要访问StartController.EventLog,但我尝试

  • 我正在使用共享库在Jenkins中构建CI/CD管道。在我的例子中,一些阶段需要通过网络应用编程接口发送执行信息。在这种情况下,我们需要将当前阶段的阶段id添加到api调用中。 如何访问与${stage_NAME}类似的stage id?

  • 问题内容: 我已经将我的代码重组为,并建立了一个精彩的长期承诺链,其中包含多个回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们? 问题答案: 当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了 ECMAScript 8 你不再需要单个调用或回调函数,因为在异步函数(被调用时返回一个Pro

  • 问题内容: 我已经将我的代码重组为promises,并建立了一个精彩的长期承诺链,其中包含多个.then()回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们? 问题答案: 当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了 ECMAScript 8 您不再需要单个调用或回调函数,因为在异