code: public static final<T>  ListenableFuture<T> retryHelper(
              final ScheduledExecutorService ses,
              final ExecutorService es,
              final Callable<T> callable,
              final long maxAttempts,
              final long startInterval,
              final TimeUnit startUnit,
              final long maxInterval,
              final TimeUnit maxUnit) {
  
          SettableFuture<T> future = SettableFuture.create();
          retryHelper(ses, es, callable, maxAttempts, startInterval, startUnit, maxInterval, maxUnit, future);
          return future;
      }
docs: A helper for retrying tasks asynchronously returns a settable future
  that can be used to attempt to cancel the task.
  
  The first executor service is used to schedule retry attempts
  The second is where the task will be subsmitted for execution
  If the two services are the same only the scheduled service is used
  
  @param maxAttempts It is the number of total attempts including the first one.
  If the value is 0, that means there is no limit.