我有两个 listenableFutures,每个都执行一个数据库查询,如果其中任何一个失败,我需要抛出自定义错误,这是我的代码:
ListenableFuture<ResultSet> future1 = ...DB query 1...;
ListenableFuture<ResultSet> future2 = ...DB query 2...;
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(2));
FutureCallback<ResultSet> callback = new FutureCallback<ResultSet>() {
//@Override
public void onSuccess(@Nullable ResultSet rows) {
//do nothing
}
//@Override
public void onFailure(Throwable throwable) {
throw new CustomizedError("Query failed", throwable);
}
};
// add callback
Futures.addCallback(future1, callback, executor);
Futures.addCallback(future2, callback, executor);
List<ListenableFuture<ResultSet>> futureList = new ArrayList<>();
futureList.add(future1);
futureList.add(future2);
for (ListenableFuture<ResultSet> future : Futures.inCompletionOrder(futureList)) {
try {
future.get();
} catch(InterruptedException | ExecutionException e) {
throw new CustomizedError("Query failed", throwable);
}
}
我的问题:
我是否必须一一调用 future.get() 以确保 future 完成(成功或失败),有没有更好的方法?
我已经为期货添加了回调,但是当我调用 future.get() 时,我仍然需要尝试/捕获并抛出相同的 CustomizedError,那么添加回调是否值得?