我有两个 completionStages 方法调用,如果不满足条件,每个调用一个远程服务。它们都是运行时间很长的进程,我们需要减少延迟。我也不关心 secondFuture 的回应。它可能会返回CompletionStage<Void>
,因为我只关心该方法是否在我们退出主方法之前运行。一个额外的复杂性是,它injectedClass2.serviceCall
还会引发一个非常重要的异常(404 StatusRuntimeException),需要将其呈现给客户端。
如何确保第一个和第二个未来异步运行(不相互依赖),同时第二个未来为客户端显示其错误代码和异常。
下面的主要方法是我最好的尝试。它可以工作,但我希望学习一个更好的实现,它可以利用 Completables/streams 等。
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);
}
也许超出范围,如何测试/检查两个完成阶段是否同时运行?
编辑:CompletableFutures.combine()
是第三方库方法,不是 java.util.concurrent 包的一部分。