docs: void stop() throws JMSException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "stop");
          Object[] cons;
  
          //for non-managed Message Listener onMessage() should not call on stop on its own context/connection.
          if (!isManaged) {
              validateStopCloseForMessageListener("stop");
          }
  
          setState(STOPPED);
  
          // We will start each consumer inside its own catch block so that
          // the failing of a single consumer does not adversely affect any
          // other. The first exception that is received is stored in this
          // variable and will be passed back up to the Connection when all
          // the starts are complete.
          JMSException excReceived = null;
  
          // Aquire consumerListsLock to ensure that sync and async lists remain in step
          // *** READ THE JAVADOC ABOVE BEFORE CHANGING THESE SYNC BLOCKS ***
          synchronized (consumerListsLock) {
              synchronized (syncConsumers) {
  
                  Iterator i = syncConsumers.iterator();
                  while (i.hasNext()) {
                      try {
                          ((JmsMsgConsumerImpl) i.next()).stop();
                      } catch (JMSException e) {
                          // No FFDC code needed
                          // Cache the exception to be thrown back at the end of the method,
                          // but don't take any other action here. The exception will already
                          // have been logged in JmsMsgConsumerImpl.stop.
                          if (excReceived == null) {
                              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                                  SibTr.debug(this, tc, "JMSException received at Session.stop. Will continue trying to stop the remaining consumers.");
                              // Cache this exception for later use.
                              excReceived = e;
                          }
                      }
                  }
  
              } // release syncConsumers lock
  
              // toArray gives us a copy of the list
              cons = asyncConsumers.toArray();
  
          } // release consumerListsLock here, before we risk blocking in individual stop calls
  
          // now iterate over copy of async list
          for (int i = 0; i < cons.length; i++) {
              try {
                  ((JmsMsgConsumerImpl) cons[i]).stop(); // may block in the stop call if onMessage is running
              } catch (JMSException e) {
                  // No FFDC code needed
                  // Cache the exception to be thrown back at the end of the method,
                  // but don't take any other action here. The exception will already
                  // have been logged in JmsMsgConsumerImpl.stop.
                  if (excReceived == null) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          SibTr.debug(this, tc, "JMSException received at Session.stop. Will continue trying to stop the remaining async consumers.");
                      // Cache this exception for later use.
                      excReceived = e;
                  }
              }
          }
  
          // Check whether an exception was thrown at any point during this method.
          if (excReceived != null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, "An exception was received during Session.stop. Propogate to Connection.");
              throw excReceived;
          }
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "stop");
      }