嵌套异步任务(在java中使用CompletionStage)

时间:2015-06-07 12:17:51

标签: java concurrency

我使用有3种方法的服务(来自库,我无法改变它):

CompletionStage<AData> getAData(int id);
CompletionStage<BData> getBData(int id);
CompletionStage<Path> computePath(int id);

为了我的目的,我应该得到AData和BData,然后根据这个值尝试计算一些Path,如果我不能这样做 - 使用服务调用

所以我的代码现在看起来像:

 CompletionStage<Path> getPath(int id) {
      service.getAData(id).thenCombine(service.getBdata(id)), (a, b) -> 
         {
             Path result = computePathLocaly(a, b);
             return result != null ? 
                            result : 
                            service.computePath(id).toCompletableFuture().join();
         }
}

一切正常,但toCompletableFuture().join()看起来非常糟糕。 将result包裹到CompletionStage并返回CompletionStage<CompletionStage<Path>> - 更糟糕的是......

我相信它可以更优雅地完成,但我无法理解如何...请帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用service.computePath(id)电话

撰写computePathLocally来电
CompletionStage<Path> getPath(int id) {
      service.getAData(id).thenCombine(service.getBdata(id)), (a, b) -> 
             return computePathLocally(a, b);
         ).thenCompose((result) -> 
           return result != null ?
                     CompletableFuture.completedFuture(result) :
                     service.computePath(id);
         )
}