/**
  * Register a group of requests (not inserts): a GotKeyListener and/or one or more SendableGet's.
  *
  * @param listener Listens for specific keys. Can be null if the listener is already registered
  *     i.e. on retrying.
  * @param getters The actual requests to register to the request sender queue.
  * @param persistent True if the request is persistent.
  * @param onDatabaseThread True if we are running on the database thread. NOTE:
  *     delayedStoreCheck/probablyNotInStore is unnecessary because we only register the listener
  *     once.
  * @throws FetchException
  */
 public void register(
     final HasKeyListener hasListener,
     final SendableGet[] getters,
     final boolean persistent,
     ObjectContainer container,
     final BlockSet blocks,
     final boolean noCheckStore)
     throws KeyListenerConstructionException {
   if (logMINOR) Logger.minor(this, "register(" + persistent + "," + hasListener + "," + getters);
   if (isInsertScheduler) {
     IllegalStateException e = new IllegalStateException("finishRegister on an insert scheduler");
     throw e;
   }
   if (persistent) {
     innerRegister(hasListener, getters, blocks, noCheckStore, container);
   } else {
     final KeyListener listener;
     if (hasListener != null) {
       listener = hasListener.makeKeyListener(container, clientContext, false);
       if (listener != null) schedTransient.addPendingKeys(listener);
       else Logger.normal(this, "No KeyListener for " + hasListener);
     } else listener = null;
     if (getters != null && !noCheckStore) {
       for (SendableGet getter : getters) datastoreChecker.queueTransientRequest(getter, blocks);
     } else {
       boolean anyValid = false;
       for (int i = 0; i < getters.length; i++) {
         if (!(getters[i].isCancelled(null)
             || getters[i].getCooldownTime(container, clientContext, System.currentTimeMillis())
                 != 0)) anyValid = true;
       }
       finishRegister(getters, false, container, anyValid, null);
     }
   }
 }