protected boolean dispatchTo(boolean toWriteQueue, boolean toScanQueue,
    final CallRunner callTask) {
    int queueIndex;
    if (toWriteQueue) {
      queueIndex = writeBalancer.getNextQueue(callTask);
    } else if (toScanQueue) {
      queueIndex = numWriteQueues + numReadQueues + scanBalancer.getNextQueue(callTask);
    } else {
      queueIndex = numWriteQueues + readBalancer.getNextQueue(callTask);
    }
    Queue<CallRunner> queue = queues.get(queueIndex);
    if (queue.size() >= currentQueueLimit) {
      return false;
    }
    return queue.offer(callTask);
  }
RPC Executor that uses different queues for reads and writes. With the options to use different
queues/executors for gets and scans. Each handler has its own queue and there is no stealing.
hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java