ListeningExector具有可变数量的ListenableFuture,需要知道何时完成

时间:2019-07-12 12:43:28

标签: java guava

我有一个REST API,我需要从中提取具有以下形状的数据层次结构:

- Grandparents
  - Parents
    - Children

初始呼叫会获取所有祖父母的列表:

Futures.addCallback(loadGrandparents(), processGrandparents());

然后对于每个祖父母(独立于其他祖父母),我需要获取所有父母。这是processGrandparents()代码:

return new FutureCallback<List<Grandparents>>() {
     @Override
     public void onSuccess(List<Grandparents> grandparents) {

         for(grandparent g : grandparents) {
             Futures.addCallback(loadParents(g), 
                                 processParents());
         }
     }
}

最后,对于每个父级(再次独立地),我需要获取子级,因此这是processParents()代码:

return new FutureCallback<List<Parents>>() {
     @Override
     public void onSuccess(List<Parents> parents) {

         for(parent p : parents) {
             Futures.addCallback(loadChildren(p), 
                                 processChildren());
         }
     }
}

最后,在processChildren()调用中,有一些数据处理,但没有其他Future。

我正在将ListenableFutures与ListeningExecutor一起使用,它工作得很好,线程被巧妙地处理。我的问题是我不知道所有链条何时完成,所以我可以说“我的REST更新现在已完成”。

我还没有看到任何可以让我以某种方式检查所有内容的示例。我是否错误地“链接”了这些回调?将侦听器添加到顶部ListenableFuture会立即触发,因此似乎并不在等待我加深的回调的完成。

加载代码示例如下(它们都遵循相同的模式):

private ListenableFuture<List<Grandparent>> loadGrandparents() {
    // The executor is from MoreExecutors.listeningDecorator
    // The ApiCall is a Callable implementation doing a HTTP call  
    return executor.submit(new ApiCall("path-to-fetch-grandparents"));
}

0 个答案:

没有答案