我有一个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"));
}