public void whenCompleted(Runnable runnable) {
    callbackFuture =
        callbackFuture.whenComplete(
            (v, e) -> {
              if (e == null) {
                runnable.run();
                if (callbackMap.get(runnable) == callbackFuture) {
                  completedFuture.complete(null);
                }
              } else {
                throw AmoroRuntimeException.wrap(e);
              }
            });
    callbackMap.put(runnable, callbackFuture);
  }
Only proceed the callback if there is no exception. Exceptions would be thrown in the
complete() method and will not trigger join return.
amoro-common/src/main/java/org/apache/amoro/process/SimpleFuture.java