docs: public void addMember(JSConsumerKey key) throws SIResourceException
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(tc, "addMember", key);
      
      lock();
      
      try
      {
        
        // If this is the first member remember the connectionUuid, all members
        // must be from the same connection
        if(connectionUuid == null)
          connectionUuid = key.getConnectionUuid();
        else if(!connectionUuid.equals(key.getConnectionUuid()))
        {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
            SibTr.exit(tc, "addMember", "SIErrorException");
          throw new SIErrorException(nls.getFormattedMessage(
              "INTERNAL_MESSAGING_ERROR_CWSIP0001",
              new Object[] {
                "com.ibm.ws.sib.processor.impl.LocalQPConsumerKeyGroup",
                "1:216:1.6.1.14" },
              null));
        }
  
        // SIB0113b Multiple consumermanager types can be part of a group
  //      // Double check that this keyGroup is for the correct consumerDispatcher
  //      if(consumerDispatcher != key.getConsumerManager())
  //      {
  //        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "addMember", "SIErrorException");
  //        throw new SIErrorException(nls.getFormattedMessage(
  //          "INTERNAL_MESSAGING_ERROR_CWSIP0001",
  //          new Object[] {
  //            "com.ibm.ws.sib.processor.impl.ConsumerKeyGroup",
  //            "1:229:1.6.1.14" },
  //          null));
  //      }
  
        // Forward scanning and ordering groups are not supported
        if(key.getForwardScanning())
        {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "addMember", "SIErrorException");
            throw new SIErrorException(
              nls.getFormattedMessage(
                "INTERNAL_MESSAGING_ERROR_CWSIP0001",
                new Object[] {
                  "com.ibm.ws.sib.processor.impl.LocalQPConsumerKeyGroup",
                  "1:242:1.6.1.14" },
                null));
        }
  
        try
        {
          // By adding a new member to the key any existing cursor on the ItemStream
          // may be in the wrong place. Other than performance there is no disadvantage to
          // starting from the top
  
          // Discard any old cursor
          if(consumerKeyFilter != null)
          {
            if(classifyingMessages)
            {
              // Take the classifications read lock
              consumerSet.takeClassificationReadLock();
     
              int numFilters = consumerKeyFilter.length;    
              for(int i=0;i<numFilters;i++)
                consumerKeyFilter[i].discard();
     
              //Create a new one (we can use the CD itemStream because we know this cannot
              // be a subscription (not supported)
              createNewFiltersAndCursors();
              
              // Free the classifications read lock
              consumerSet.freeClassificationReadLock();
            }
            else
            {
              consumerKeyFilter[0].discard();
              //Create a new one (we can use the CD itemStream because we know this cannot
              // be a subscription (not supported)
              createNewFiltersAndCursors();
            }
          }
          else // Need to set up new filters
          {
            if(classifyingMessages)
            {
              // Take the classifications read lock
              consumerSet.takeClassificationReadLock();
     
              //Create a new one (we can use the CD itemStream because we know this cannot
              // be a subscription (not supported)
              createNewFiltersAndCursors();
              
              // Free the classifications read lock
              consumerSet.freeClassificationReadLock();
            }
            else
            {
              //Create a new one (we can use the CD itemStream because we know this cannot
              // be a subscription (not supported)
              createNewFiltersAndCursors();
            }        
          }
        }
        catch (MessageStoreException e)
        {
          // MessageStoreException shouldn't occur so FFDC.
          FFDCFilter.processException(
            e,
            "com.ibm.ws.sib.processor.impl.LocalQPConsumerKeyGroup.addMember",
            "1:307:1.6.1.14",
            this);
  
          SibTr.exception(tc, e);
  
          SIResourceException newE = new SIResourceException(
                                        nls.getFormattedMessage(
                                          "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                                          new Object[] {
                                            "com.ibm.ws.sib.processor.impl.LocalQPConsumerKeyGroup",
                                            "1:317:1.6.1.14",
                                            e },
                                          null),
                                        e);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
            SibTr.exit(tc, "addMember", newE);
  
          throw newE;
  
        }
  
        synchronized(consumerDispatcher.getDestination().getReadyConsumerPointLock())
        {
          // By adding another member they cannot all be ready (the new one cannot be)
          // therefore we must remove the group from the CD's ready list
          if(ready)
          {
            //set the state to not ready
            ready = false;
  
            consumerDispatcher.removeReadyConsumer(this, specificReady);
          }
        }
  
        // If real life we expect there only to be a single member of the group
        // (JMS will always specify OrderingContext). Therefore we optimise the
        // case for one member - we avoid any lists
        if(memberCount == 0)
        {
          singleMember = (LocalQPConsumerKey)key;
  
          if(!(key.isSpecific()))
            generalMemberCount++;
        }
        else
        {
          if(singleMember != null)
          {
            if(generalMemberCount == 1)
              addMemberToList(singleMember, false);
            else
              addMemberToList(singleMember, true);
  
            singleMember = null;
          }
  
          if(key.isSpecific())
          {
            addMemberToList(key, true);
          }
          else
          {
            generalMemberCount++;
            addMemberToList(key, false);
          }
        }
  
        memberCount++;
      }
      finally
      {
        unlock();
      }
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "addMember", Long.valueOf(memberCount));
    }