code: public synchronized void invalidate(boolean appInvoked) {
          if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
              LoggingUtil.SESSION_LOGGER_WAS.entering(methodClassName, methodNames[INVALIDATE], appInvoked);
          }
          getSwappableListeners(BackedSession.HTTP_SESSION_BINDING_LISTENER);
          if (appInvoked && (!invalInProgress) && isValid())
              _storeCallback.sessionCacheDiscard(this);
          super.invalidate();
          //The session will be invalid, but do we need to worry about these in case we are already processing this session somewhere else?
          if (this.appDataChanges != null)
              this.appDataChanges.clear();
          if (this.appDataRemovals != null)
              this.appDataRemovals.clear();
          this.update = null;
          this.userWriteHit = false;
          this.maxInactWriteHit = false;
          this.listenCntHit = false;
          setSwappableData(null);
          this.mNonswappableData = null;
          if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
              LoggingUtil.SESSION_LOGGER_WAS.exiting(methodClassName, methodNames[INVALIDATE]);
          }
      }
docs: /*
  PM03375.1: Introduce boolean parameter to distinguish between application invoked invalidation and timeout.
  If so then we need to call sessionCacheDiscard