protected boolean dispatchMessage(ClientMessage clientMessage) throws IOException {
    boolean isDispatched = false;
    if (logger.isTraceEnabled(LogMarker.BRIDGE_SERVER_VERBOSE)) {
      logger.trace(LogMarker.BRIDGE_SERVER_VERBOSE, "Dispatching {}", clientMessage);
    }

    final Message message;
    if (clientMessage instanceof ClientUpdateMessage) {
      ClientUpdateMessage clientUpdateMessage = (ClientUpdateMessage) clientMessage;
      byte[] latestValue = (byte[]) clientUpdateMessage.getValue();
      if (logger.isTraceEnabled()) {
        StringBuilder msg = new StringBuilder(100);
        msg.append(this).append(": Using latest value: ").append(Arrays.toString(latestValue));
        if (clientUpdateMessage.valueIsObject()) {
          if (latestValue != null) {
            msg.append(" (").append(deserialize(latestValue)).append(")");
          }
          msg.append(" for ").append(clientMessage);
        }
        logger.trace(msg.toString());
      }

      // authorize the message before dispatching
      SecurityService securityService = getCache().getSecurityService();
      // for legacy security, we don't support auth expiration
      if (securityService.isIntegratedSecurity()) {
        if (getProxy().getSubject() != null) {
          securityService.authorize(getResourcePermission(clientUpdateMessage),
              getProxy().getSubject());
        } else {
          // if it's multi-user mode
          ClientUpdateMessageImpl.CqNameToOp clientCq =
              clientUpdateMessage.getClientCq(getProxy().getProxyID());
          if (clientCq != null) {
            String[] names = clientCq.getNames();
            for (String cqName : names) {
              Subject subject = getProxy().getSubject(cqName);
              if (subject != null) {
                securityService.authorize(getResourcePermission(clientUpdateMessage), subject);
              }
            }
          }
        }
      }
      message = ((ClientUpdateMessageImpl) clientMessage).getMessage(getProxy(), latestValue);

      if (CacheClientProxy.AFTER_MESSAGE_CREATION_FLAG) {
        ClientServerObserver bo = ClientServerObserverHolder.getInstance();
        bo.afterMessageCreation(message);
      }
    } else {
      message = clientMessage.getMessage(getProxy(), true /* notify */);
    }

    if (!_proxy.isPaused()) {
      sendMessage(message);

      if (logger.isTraceEnabled()) {
        logger.trace("{}: Dispatched {}", this, clientMessage);
      }
      isDispatched = true;
    } else {
      if (logger.isDebugEnabled()) {
        logger.debug("Message Dispatcher of a Paused CCProxy is trying to dispatch message");
      }
    }
    if (isDispatched) {
      _messageQueue.getStatistics().incEventsDispatched();
    }
    return isDispatched;
  }
Sends a message to the client attached to this proxy

@param clientMessage The <code>ClientMessage</code> to send to the client
geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/MessageDispatcher.java