code: public int getReaperInterval(long timeout) {
  
          int rpi = (int) _smc.getReaperPollInterval();
          if (rpi < 30) { // prop not set or too small
              int randomLessThanThirty = (int) (System.currentTimeMillis() % 30);
              if (timeout <= 120) { // up to 2 minutes
                  rpi = 60 - randomLessThanThirty; // reaper runs every 30 to 60 seconds
              } else if (timeout <= 900) { // up to 15 minutes
                  rpi = 60 + randomLessThanThirty; // reaper runs every 60 to 90 seconds
              } else if (timeout <= 1800) { // up to 30 minutes
                  rpi = 120 + (2 * randomLessThanThirty); // reaper runs every 2 to 3
                  // minutes
              } else { // more than 30 minutes
                  rpi = 240 + (2 * randomLessThanThirty); // reaper runs every 4 to 5
                  // minutes
              }
              _smc.setReaperPollInterval(rpi);
          }
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_CORE.isLoggable(Level.FINE)) {
              LoggingUtil.SESSION_LOGGER_CORE.logp(Level.FINE, methodClassName, "getReaperInterval", "returning " + rpi);
          }
          return rpi;
      }
docs: /*
  Calculates the interval at which the invalidator (aka reaper) will run.
  If the HttpSessionReaperPollInterval property is set to 30 or more, use it.
  Otherwise, algorithm is based on the session timeout with some randomness
  to spread out the workload