我有两个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);
}
链接其他阶段不会改变以前的阶段。换句话说,并行性完全不在您的控制范围之内,因为它已经被确定了。
更具体地说,当您调用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)
在本例中,您不影响FirstFuture
或SecondFuture
的完成。您只是指定在两个期货都完成后应该发生什么。
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/ 问题答案: 这是一个例子: 只需管道另一个过滤器: 在您的模板中: