code: public static Supplier<Delay> decorrelatedJitter(Duration lower, Duration upper, long base, TimeUnit targetTimeUnit) {
  
          LettuceAssert.notNull(lower, "Lower boundary must not be null");
          LettuceAssert.isTrue(lower.toNanos() >= 0, "Lower boundary must be greater or equal to 0");
          LettuceAssert.notNull(upper, "Upper boundary must not be null");
          LettuceAssert.isTrue(upper.toNanos() > lower.toNanos(), "Upper boundary must be greater than the lower boundary");
          LettuceAssert.isTrue(base >= 0, "Base must be greater or equal to 1");
          LettuceAssert.notNull(targetTimeUnit, "Target TimeUnit must not be null");
  
          // Create new Delay because it has state.
          return () -> new DecorrelatedJitterDelay(lower, upper, base, targetTimeUnit);
      }
docs: Creates a {@link Supplier} that constructs new {@link DecorrelatedJitterDelay} instances.
  
  @param lower the lower boundary, must be non-negative
  @param upper the upper boundary, must be greater than the lower boundary
  @param base the base, must be greater or equal to 0
  @param targetTimeUnit the unit of the delay.
  @return a new {@link Supplier} of {@link DecorrelatedJitterDelay}.
  @since 5.0