docs: public void removeCallbackFromRegisteredMonitors(
      ConsumerSetChangeCallback callback,
      String topicExpression,
      boolean isWildcarded,
      Map registeredMonitorsMap)
    throws SINotPossibleInCurrentConfigurationException,
           SIErrorException
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
          SibTr.entry(
            tc,
            "removeCallbackFromRegisteredMonitors",
            new Object[] { callback,
                           topicExpression,
                           new Boolean(isWildcarded)});
  
      ArrayList matchingConsumerList = null;
  
      RegisteredCallbacks rMonitor = (RegisteredCallbacks)registeredMonitorsMap.get(topicExpression);
  
      //Handle the case where we cannot find the monitor
      if(rMonitor != null)
      {
        // Have located the monitor record
        // Get the list of callbacks prepare to remove this one
        ArrayList callbackList = rMonitor.getWrappedCallbacks();
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
          SibTr.debug(tc, "Found existing entry with callbacks: " + callbackList);
        WrappedConsumerSetChangeCallback wcb = new WrappedConsumerSetChangeCallback(callback);
        boolean cbRemoved = callbackList.remove(wcb);
        if(!cbRemoved)
        {
          //Couldn't find the callback. This means we have an internal inconsistency
          // in our tables, so throw an SIErrorException
  
          // Build the message for the Exception
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
            SibTr.exit(tc, "removeCallbackFromRegisteredMonitors", callback);
  
          SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0005",
            new Object[] {
              "com.ibm.ws.sib.processor.matching.ConsumerMonitorRegistrar",
              "1:372:1.10",
              callback });
          throw new SIErrorException(
            nls.getFormattedMessage(
              "INTERNAL_MESSAGING_ERROR_CWSIP0005",
              new Object[] {
                "com.ibm.ws.sib.processor.matching.ConsumerMonitorRegistrar",
                "1:379:1.10",
                callback },
              null));
  
        }
  
        // If the callbacklist is now empty, then we need to walk the matching
        // consumers, removing references and delete the record in the table
        if(callbackList.isEmpty())
        {
          // Get the list of matching consumers and remove the monitor references from
          // them.
          matchingConsumerList = rMonitor.getMatchingConsumers();
          // Are there consumers for this expression
          boolean areConsumers = !matchingConsumerList.isEmpty();
  
          if(areConsumers)
          {
            // Remove reference to this registration from each consumer
            Iterator i = matchingConsumerList.iterator();
            while (i.hasNext())
            {
              MonitoredConsumer mc = (MonitoredConsumer)i.next();
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                SibTr.debug(tc, "Remove registration from consumer: " + mc);
  
              // Remove the reference from the wildcarded list in the consumer
              boolean removed;
              if(isWildcarded)
                removed = mc.removeMatchingWildcardMonitor(topicExpression);
              else
                removed = mc.removeMatchingExactMonitor(topicExpression);
  
              if(!removed)
              {
                // Couldn't find the registration. This means we have an internal
                // inconsistency in our tables, so throw an SIErrorException
  
                // Build the message for the Exception
                if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "removeCallbackFromRegisteredMonitors", mc + ":" + topicExpression);
  
                SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0005",
                  new Object[] {
                    "com.ibm.ws.sib.processor.matching.ConsumerMonitorRegistrar",
                    "1:425:1.10",
                    mc + ":" + topicExpression });
                throw new SIErrorException(
                  nls.getFormattedMessage(
                    "INTERNAL_MESSAGING_ERROR_CWSIP0005",
                    new Object[] {
                      "com.ibm.ws.sib.processor.matching.ConsumerMonitorRegistrar",
                      "1:432:1.10",
                      mc + ":" + topicExpression },
                    null));
              }
            }
          }
  
          // Now remove the record from the table
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
            SibTr.debug(tc, "No more callbacks for this topicexpression, delete record");
  
          registeredMonitorsMap.remove(topicExpression);
        }
      }
      else
      {
        // Failed to find the callback
        // Build the message for the Exception
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
          SibTr.exit(tc, "removeCallbackFromRegisteredMonitors", callback);
  
        SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0005",
          new Object[] {
            "com.ibm.ws.sib.processor.matching.ConsumerMonitorRegistrar",
            "1:456:1.10",
            callback });
        throw new SINotPossibleInCurrentConfigurationException(
          nls.getFormattedMessage(
            "INTERNAL_MESSAGING_ERROR_CWSIP0005",
            new Object[] {
              "com.ibm.ws.sib.processor.matching.ConsumerMonitorRegistrar",
              "1:463:1.10",
              callback },
            null));
      }
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "removeCallbackFromRegisteredMonitors");
    }