docs: public void run(int attempt) throws Exception {
  
          reconnectSchedulerSync.set(false);
          reconnectScheduleTimeout = null;
  
          if (!isEventLoopGroupActive()) {
              logger.debug("isEventLoopGroupActive() == false");
              return;
          }
  
          if (!isListenOnChannelInactive()) {
              logger.debug("Skip reconnect scheduling, listener disabled");
              return;
          }
  
          if (isReconnectSuspended()) {
              logger.debug("Skip reconnect scheduling, reconnect is suspended");
              return;
          }
  
          boolean shouldLog = shouldLog();
  
          InternalLogLevel infoLevel = InternalLogLevel.INFO;
          InternalLogLevel warnLevel = InternalLogLevel.WARN;
  
          if (shouldLog) {
              lastReconnectionLogging = System.currentTimeMillis();
          } else {
              warnLevel = InternalLogLevel.DEBUG;
              infoLevel = InternalLogLevel.DEBUG;
          }
  
          InternalLogLevel warnLevelToUse = warnLevel;
  
          try {
              reconnectionListener.onReconnectAttempt(new ConnectionEvents.Reconnect(attempt));
              logger.log(infoLevel, "Reconnecting, last destination was {}", remoteAddress);
  
              Tuple2<CompletableFuture<Channel>, CompletableFuture<SocketAddress>> tuple = reconnectionHandler.reconnect();
              CompletableFuture<Channel> future = tuple.getT1();
  
              future.whenComplete((c, t) -> {
  
                  if (c != null && t == null) {
                      return;
                  }
  
                  if (ReconnectionHandler.isExecutionException(t)) {
                      logger.log(warnLevelToUse, "Cannot reconnect: {}", t.toString());
                  } else {
                      logger.log(warnLevelToUse, "Cannot reconnect: {}", t.toString(), t);
                  }
  
                  CompletableFuture<SocketAddress> remoteAddressFuture = tuple.getT2();
                  SocketAddress remote = remoteAddress;
                  if (remoteAddressFuture.isDone() && !remoteAddressFuture.isCompletedExceptionally()
                          && !remoteAddressFuture.isCancelled()) {
                      remote = remoteAddressFuture.join();
                  }
  
                  eventBus.publish(new ReconnectFailedEvent(LocalAddress.ANY, remote, t, attempt));
  
                  if (!isReconnectSuspended()) {
                      scheduleReconnect();
                  }
              });
          } catch (Exception e) {
              logger.log(warnLevel, "Cannot reconnect: {}", e.toString());
              eventBus.publish(new ReconnectFailedEvent(LocalAddress.ANY, remoteAddress, e, attempt));
          }
      }