docs: public void put(List undeliveredMessages, boolean isRestoring) throws SIResourceException
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this,tc, "put", undeliveredMessages);
      int length = undeliveredMessages.size();
  
      // read the RemoteQPConsumerKey for later on updating the prefetching stuff.
      // need to do this before adding to item stream since spilling will wipe out this data
      // and there is no guarantee how soon that could occur.
      RemoteQPConsumerKey[] rcks = new RemoteQPConsumerKey[length];
  
      // add them all in one transaction
      LocalTransaction tran = null;
      try
      {
        tran = _tranManager.createLocalTransaction(true);
        for (int i=0; i<length; i++)
        {
          AIMessageItem msg = (AIMessageItem) undeliveredMessages.get(i);
          RemoteDispatchableKey dkey = msg.getAIStreamKey().getRemoteDispatchableKey();
          if (dkey instanceof RemoteQPConsumerKey)
            rcks[i] = (RemoteQPConsumerKey) dkey;
  
          itemStream.addItem(msg, (Transaction) tran);
          registerForEvents(msg);
  
          // Identify the fact that the message originated on a remote queue point
          // in order for consumer key groups to find the correct getCursor later on
          msg.setLocalisingME(getLocalisationUuid());
        }
        tran.commit();
      }
      catch (Exception e)
      {
        // log error
        FFDCFilter.processException(e,
          "com.ibm.ws.sib.processor.impl.RemoteConsumerDispatcher.put","1:708:1.97.2.21",this);
        SibTr.exception(tc, e);
  
        if (tran != null)
        {
          try
          {
            tran.rollback();
          }
          catch (Exception e2)
          {
            // log error
            FFDCFilter.processException(e2,
              "com.ibm.ws.sib.processor.impl.RemoteConsumerDispatcher.put","1:721:1.97.2.21",this);
            SibTr.exception(tc, e2);
          }
        }
  
        if (!isRestoring)
        {
          // tell the consumers, since ordering may be violated. A consumer that wants ordering guarantees
          // should detach and reattach
          SIIncorrectCallException e3 = new SIIncorrectCallException(
            nls.getFormattedMessage("PUTEXCEPTION_DISCONNECT_CONSUMER_CWSIP0473",
                                    new Object[]{getDestName(), getLocalisationUuid().toString(), e},
                                    null));
          dispatchExceptionToConsumers(e3);
    
          // reject the messages and also notify the waiting ConsumerKey
          for (int i=0; i<length; i++)
          {
            AIMessageItem msg = (AIMessageItem) undeliveredMessages.get(i);
            AIStreamKey key = msg.getAIStreamKey();
            _aih.reject(key);
            resolve(key); // Resolve so that we re-request a msg and dont forget about the request that just failed
          }
        }
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) 
          SibTr.exit(tc, "put", e);
        return;
  
      }
      
      // successfully added to itemStream
      for (int i=0; i<length; i++)
      {
        AIMessageItem msg = (AIMessageItem) undeliveredMessages.get(i);
  
        if (msg.isReserved())
          msg.restoreAOData(lockID);
          
        // If the above failed then we may no longer be reserved
        if (!msg.isReserved())
        {
          // update prefetching stuff
          if (rcks[i] != null)
            rcks[i].messageReceived(msg.getAIStreamKey());
    
          // call dispatchInternal()
          dispatchInternalAndHandleException(msg);
        }
      }
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) 
        SibTr.exit(tc, "put");
    }