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

我必须在whenComplete()中调用join()来表示未来吗?

华坚成
2023-03-14

我正在向现有endpoint添加一些代码来发送电子邮件。我们不需要发送电子邮件的结果来向用户返回响应,所以我在期货链的末尾添加了一个. whenCompl(),从内部调用我们的电子邮件服务。对电子邮件服务的调用也是异步的,返回一个CompletionStage

CompletionStage<SomeResponse> someEndpoint() {
  return doThings()
      .thenApply(things -> {
        return someResponseFormat(things);
      })
      .whenComplete((someResponse, ex) -> {
        if (ex == null) {
          emailClient.sendEmail(someResponse); // CompletionStage<Void>
        }
      });
}

据我所知,该任务将被安排和执行。我需要在sendEmail(…)上调用join()吗?这样做与不打电话会有不同的行为吗?最佳实践是什么?

编辑:最初我问我是否需要调用join()或get(),这被误解为“我需要调用哪一个”,而我的意思是“我到底需要调用哪个”


共有1个答案

敖淮晨
2023-03-14

emailClient关联的操作。sendEmail(someResponse)将被调度,而不管您是否等待其完成,因此除非JVM同时终止,否则它将完成。但是

> < li>

没有人会注意到操作何时完成或能够等待其完成。

当操作失败并出现异常时,没有人会注意到。

所以你可能想做的是

CompletionStage<SomeResponse> someEndpoint() {
  return doThings()
      .thenApply(things -> someResponseFormat(things))
      .thenCompose(someResponse -> emailClient.sendEmail(someResponse)
          .thenApply(_void -> someResponse));
}

然后,当某个Endpoint()的调用方在其上调用连接()时,join()将等待发送电子邮件的完成,并在发送电子邮件失败时报告错误。同样,当某些Endpoint()链的调用者依赖操作时,它们将在发送电子邮件完成后启动。

 类似资料:
  • 我有方法 在正文中,我编写了一些HashMap的键集 看起来还可以,但如果我想重复这个代码 我得用try/catch来包围它。像这样 我不明白为什么

  • 我想将Oracle表映射到我创建的Java实体。在Oracle表中,我有: 称为数字(6,3)类型的字段 一个称为B的字段,类型为数字(6,0) 对于Java实体中与名为A的字段相对应的属性,我必须有一个BigDecimal(或者一个Float就足够了)?我必须有@列(精度=6,比例=2)? 我发现BigDecimal可能有点重,但如果有必要,我会使用它。将来我可能会使用这个实体为我的H2(DDL

  • 对于命令和 如果我是对的: 如果我想从packagist向我的项目添加库,我需要使用 我有一个项目,我不想将其发布到https://packagist.org/ 我只想在我的项目中添加一些库。 在运行之前,是否必须运行? 我看了一个教程,其中他们使用命令,然后调用,这让我很困惑,因为我认为与在Packagist上发布库有关。

  • 我正在寻找一种将任意长度的期货列表转换为期货列表的方法。我使用的是Playframework,所以最终,我真正想要的是一个<code>未来〔结果〕,但为了让事情更简单,让我们说<code>将来〔List[Int]]通常的方法是使用<code>Future.sequence(…) 例如,执行以下操作不起作用: 我希望能够将1和3从那里拉出来,而不是只得到异常。我尝试将来使用<code>。折叠,但这显

  • 我不明白为什么当一个被破坏时,它必须处于连接()或分离()状态。 连接等待线程完成,而分离不会。似乎有一些我不理解的中间状态。因为我的理解是连接和分离是互补的:如果我不调用连接(),那么分离()是默认的。 逻辑上的detach()应该是线程的默认行为,因为这是线程的定义,它们是并行执行的,与其他线程无关。 那么,当线程对象被破坏时,为什么要调用terminate()呢?为什么标准不能简单地将线程视

  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。