docs: @Override
      public synchronized void reschedule(String cronExp, VaryingCronOpCall opLambda) {
          verifyCanRescheduleState();
          assertArgumentNotNull("cronExp", cronExp);
          assertArgumentNotNull("opLambda", opLambda);
          if (isNonCromExp(cronExp)) {
              throw new IllegalArgumentException("The cronExp for reschedule() should not be non-cron: " + toString());
          }
          if (unscheduled) {
              unscheduled = false; // can revive from unscheduled
          }
          final String existingCronExp = cron4jTask.getVaryingCron().getCronExp();
          cron4jTask.switchCron(cronExp, createCronOption(opLambda));
          final Cron4jScheduler cron4jScheduler = cron4jNow.getCron4jScheduler();
          cron4jId.ifPresent(id -> {
              if (JobChangeLog.isEnabled()) {
                  JobChangeLog.log("#job ...Rescheduling {} as cron from '{}' to '{}'", jobKey, existingCronExp, cronExp);
              }
              if (isNativeScheduledId(cron4jScheduler, id)) {
                  cron4jScheduler.reschedule(id, cronExp);
              } else { // after descheduled
                  cron4jId = scheduleNative(cronExp, cron4jScheduler);
              }
          }).orElse(() -> {
              if (JobChangeLog.isEnabled()) {
                  JobChangeLog.log("#job ...Rescheduling {} as cron from non-cron to '{}'", jobKey, cronExp);
              }
              cron4jId = scheduleNative(cronExp, cron4jScheduler);
          });
      }