code: public static RejectedExecutionHandler backoff(final int retries, long backoffAmount, TimeUnit unit) {
          ObjectUtil.checkPositive(retries, "retries");
          final long backOffNanos = unit.toNanos(backoffAmount);
          return new RejectedExecutionHandler() {
              @Override
              public void rejected(Runnable task, SingleThreadEventExecutor executor) {
                  if (!executor.inEventLoop()) {
                      for (int i = 0; i < retries; i++) {
                          // Try to wake up the executor so it will empty its task queue.
                          executor.wakeup(false);
  
                          LockSupport.parkNanos(backOffNanos);
                          if (executor.offerTask(task)) {
                              return;
                          }
                      }
                  }
                  // Either we tried to add the task from within the EventLoop or we was not able to add it even with
                  // backoff.
                  throw new RejectedExecutionException();
              }
          };
      }
docs: Tries to backoff when the task can not be added due restrictions for an configured amount of time. This
  is only done if the task was added from outside of the event loop which means
  {@link EventExecutor#inEventLoop()} returns {@code false}.