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

同时运行Void CompletionStage,但忽略result

陈夜洛
2023-03-14

我有两个completionStages方法调用,如果一个条件不满足,每个调用一个远程服务。它们都是相当长的运行过程,我们需要减少延迟。我也不关心第二个未来的回应。它可以返回CompletionStage ,因为我只关心该方法是否在退出main方法之前运行。增加的复杂性是injectedclass2.serviceCall还会抛出一个非常重要的异常(404StatusRuntimeException),需要向客户机显示该异常。

如何确保第一个和第二个future异步运行(不相互依赖),同时第二个future为客户机显示其错误代码和异常。

try {
      .
      .
      .
      CompletionStage<Response> firstFuture;
      CompletionStage<Response> secondFuture = CompletableFuture.completedFuture(Response.default());
      if (condition) {
        firstFuture = legacyImplThing.resolve(param1, param2);
      } else {
        firstFuture =
            injectedClass1.longRunningOp(param1, param2);
        secondFuture = injectedClass2.serviceCall(param1, param2, someOtherData);
      }

      final CompletionStage<MainMethodResponse> response =
          CompletableFutures.combine(firstFuture, secondFuture, (a, b) -> a)
              .thenApply(
                  v -> ServiceResponse.newBuilder().setParam(v.toString()).build());

      handleResponse(response, responseObserver);
    } catch (Exception e) {
      responseObserver.onError(e);
    }

共有1个答案

柴意智
2023-03-14

链接其他阶段不会改变以前的阶段。换句话说,并行性完全不在您的控制范围之内,因为它已经被确定了。

更具体地说,当您调用injectedclass1.longrunningop(param1,param2)时,方法longrunningop的实现决定返回的future将如何完成。同样,当调用injectedclass2.serviceCall(param1,param2,someOtherData)时,serviceCall的实现将决定返回的future是否完成。这两种方法可以在幕后使用相同的执行者,也可以使用完全不同的方法。

唯一可以影响并行性的情况是,这两个方法都在调用者的线程中执行实际操作,最终返回已经完成的将来。在这种情况下,您必须将每个调用封装到另一个异步操作中,以让它们并行运行。但是,在调用者的线程中执行一个冗长的操作时返回一个将来,这将是一个奇怪的设计。

您的代码

CompletableFutures.combine(firstFuture, secondFuture, (a, b) -> a)

与文档化的API不匹配。一个有效的调用将是

firstFuture.thenCombine(secondFuture, (a, b) -> a)

在本例中,您不影响FirstFutureSecondFuture的完成。您只是指定在两个期货都完成后应该发生什么。

firstFuture.thenCombine(secondFuture,
    (v, b) -> ServiceResponse.newBuilder().setParam(v.toString()).build())

首先。

 类似资料:
  • 问题内容: 我必须使用大量未明确指定serialVersionUID的已编译Java类。由于它们的UID是由编译器任意生成的,因此即使实际的类定义匹配,许多需要序列化和反序列化的类最终也会导致异常。(当然,这是所有预期的行为。) 对我来说,返回并修复所有第3方代码是不切实际的。 因此,我的问题是:是否有任何方法可以使Java运行时 忽略 serialVersionUID中的差异,并且仅在结构上存在

  • 我们有一个Spring-Boot1.0.rc1应用程序,为日志配置了logback,并在src/test/resources中有一个logback.xml文件。当我们从maven运行spring-boot时,日志文件似乎会被看到和尊重。(这是我们在spring-boot徽标之后所需的日志格式) 但是,当我们删除一个溜进src/java/resources的流氓logback.xml文件,并在其他所

  • 我正在Scala中开发一个利用SBT构建的Spark应用程序。Spark创建了非常冗长的日志记录,在运行测试时,我希望忽略这些日志记录。 我在src/test/resources和src/main/resources下设置了log4j.properties文件,其内容如下:

  • 我正在使用计划执行服务 以固定速率运行runnable

  • 我使用的是PACT JVM https://github.com/dius/pact-jvm/tree/master/provider/pact-jvm-provider-junit我不知道为什么我的联系人中的匹配规则被忽略了。我的HTTP测试 还有我的合同档案 并在运行后显示错误 请帮忙把我的观点说错。 谢谢,

  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ // 写入测试数据 $filePath = $excel->f

  • 问题内容: 有没有更好的方法来忽略Angularjs中的时区: “ 2014-01-18 14:30:00”而不是“ 2014-01-18 15:30:00” http://jsfiddle.net/samibel/2rMXJ/ 问题答案: 这是一个例子: 只需管道另一个过滤器: 在您的模板中: