如何知道 ListenableFutures 是否已完成

时间:2021-01-15 15:48:08

标签: guava future

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

我的问题:

  1. 我是否必须一一调用 future.get() 以确保 future 完成(成功或失败),有没有更好的方法?

  2. 我已经为期货添加了回调,但是当我调用 future.get() 时,我仍然需要尝试/捕获并抛出相同的 CustomizedError,那么添加回调是否值得?

0 个答案:

没有答案