code: public <T> AsyncFutureCallback<T> callbackWithTimeoutAndErrorHandlerAndOnTimeout(
              final Callback<T> callback,
              final long timeoutDuration,
              final TimeUnit timeUnit,
              final Runnable onTimeout,
              final Consumer<Throwable> onError) {
  
          final AtomicReference<AsyncFutureCallback<T>> ref = new AtomicReference<>();
  
          final AsyncFutureCallbackImpl<T> asyncFutureCallback =
                  AsyncFutureCallbackImpl.callback(callback, currentTime,
                          timeUnit.toMillis(timeoutDuration),
                          createOnFinished(ref)
                          , onTimeout, onError);
  
          ref.set(asyncFutureCallback);
          addCallback(asyncFutureCallback);
          return asyncFutureCallback;
  
      }
docs: Create a callback
  
  @param callback        callback
  @param timeoutDuration timeout duration
  @param timeUnit        time unit of timeout
  @param onTimeout       onTimeout handler
  @param onError         on error handler
  @param <T>             T
  @return callback