docs: @Override
      public ControlHandler getControlHandler(
                                              ProtocolType type,
                                              SIBUuid8 sourceMEUuid,
                                              ControlMessage msg)
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(
                          tc,
                          "getControlHandler",
                          new Object[] { type, sourceMEUuid, msg });
  
          ControlHandler msgHandler = null;
  
          if (type == ProtocolType.UNICASTINPUT)
          {
              // do nothing, check the tSIB code,
          }
          else if (type == ProtocolType.UNICASTOUTPUT)
          {
              // do nothing, check the tSIB code,
          }
          else if (type == ProtocolType.PUBSUBINPUT)
          {
              msgHandler = (ControlHandler) inputHandler;
          }
          else if (type == ProtocolType.PUBSUBOUTPUT)
          {
              msgHandler = _pubSubRealization.getControlHandler(sourceMEUuid);
          }
          else if (type == ProtocolType.ANYCASTINPUT)
          {
              // For durable, AIHs are referenced by pseudo destination ID so check for that first
              SIBUuid12 destID =
                              msg.getGuaranteedTargetDestinationDefinitionUUID();
              SIBUuid12 gatheringTargetDestUuid = msg.getGuaranteedGatheringTargetUUID();
  
              if (isPubSub())
              {
                  msgHandler = _protoRealization.
                                  getRemoteSupport().
                                  getAnycastInputHandlerByPseudoDestId(destID);
  
              }
  
              // Otherwise, use the uuid of the sourceCellule ME to find the AIH to handle the message. We assume that this
              // uuid corresponds to that used to choose the AIH initially, and that was used by the AIH as the
              // uuid of the DME to which it sent the request for the message.
  
              /**
               * 466323
               * We now no longer create the AnycastInputHandler (+ its persistent resources) when
               * a message arrives and we cant find an existing one.
               * 
               * If the RME AIH resources do not exist, this means we *must* have previously completed
               * a successful flush. This means that the DME has sent us a flush. If they have done
               * this then they must be cleaned up their end.
               * 
               * We therefore do not create new resources when the AIH cannot be found. Instead we
               * generate warnings at the RemoteMessageReceiver level to indicate cleanup is required
               * on the DME. We should only be able to get into this situation if the msgStore for the
               * RME has been deleted (either db tables removed or ME was restarted based on a backup db).
               */
              if (msgHandler == null)
                  msgHandler = getAnycastInputHandler(sourceMEUuid, gatheringTargetDestUuid, false);
          }
          else if (type == ProtocolType.ANYCASTOUTPUT)
          {
              // For durable, AOHs are referenced by pseudo destination ID so check for that first
              SIBUuid12 destID = msg.getGuaranteedTargetDestinationDefinitionUUID();
  
              msgHandler = _protoRealization.
                              getRemoteSupport().
                              getAnycastOutputHandlerByPseudoDestId(destID);
  
              // Otherwise, assume this is a queueing access and get the output handler as usual
              if (msgHandler == null)
                  msgHandler = getAnycastOutputHandler();
          }
          //else
          // {
          //unsupported protocol type
          //return null
          // }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "getControlHandler", msgHandler);
  
          return msgHandler;
      }