@SuppressWarnings("FutureReturnValueIgnored")
  public static <T> void addListener(CompletableFuture<T> future,
    BiConsumer<? super T, ? super Throwable> action, Executor executor) {
    future.whenCompleteAsync((resp, error) -> {
      try {
        action.accept(resp, unwrapCompletionException(error));
      } catch (Throwable t) {
        LOG.error("Unexpected error caught when processing CompletableFuture", t);
      }
    }, executor);
  }
Almost the same with {@link #addListener(CompletableFuture, BiConsumer)} method above, the only
exception is that we will call
{@link CompletableFuture#whenCompleteAsync(BiConsumer, Executor)}.
@see #addListener(CompletableFuture, BiConsumer)
hbase-common/src/main/java/org/apache/hadoop/hbase/util/FutureUtils.java