docs: void addNewMessage(JsMessageWrapper message, boolean isStored, boolean isRecoverable)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(tc,
                    "addNewMessage",
                    new Object[] { new Integer(hashCode()),
                                   message,
                                   new Boolean(isStored)});
  
      JsMessage jsMsg = message.getMessage();
  
      long id = jsMsg.getSystemMessageValue();
      SIBUuid8 uuid = jsMsg.getSystemMessageSourceUuid();
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
        SibTr.debug(tc,
                    "addNewMessage",
                    new Object[] { new Integer(hashCode()),
                                   new Long(jsMsg.getSystemMessageValue()),
                                   jsMsg.getSystemMessageSourceUuid(),
                                   message,
                                   new Boolean(isStored)});
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
        SibTr.debug(localConsumerPoint, tc, "verboseMsg OUT : " + message.getMessage().toVerboseString());
  
      synchronized(this)
      {
        LMEMessage newElement = null;
        long messageReferenceExpiry = messageProcessor.getCustomProperties().get_message_reference_expiry_value();
  
        // We have to create an object if the pool is empty
        if(pooledMsg == null)
        {
          newElement = new LMEMessage(id, uuid, message, isStored, isRecoverable, messageLockExpiry, messageReferenceExpiry);
        }
        // Otherwise pop the first pooled object and use that
        else
        {
          newElement = pooledMsg;
          pooledMsg = pooledMsg.next;
          newElement.next = null;
          pooledCount--;
  
          newElement.reuseMessage(id, uuid, message, isStored, isRecoverable, messageLockExpiry, messageReferenceExpiry);
        }
  
        // Add the message to the end of the list
        newElement.previous = lastMsg;
        if(lastMsg != null)
          lastMsg.next = newElement;
        else
          firstMsg = newElement;
        lastMsg = newElement;
  
        // If the locks are set to expire and this is the first message we need to
        // register an alarm
        if(messageLockExpiry != 0)
        {
          // If there are no other messages expiring, this will be the first one
          if(nextMsgToExpire == null)
            nextMsgToExpire = newElement;
  
          // If we don't have an alarm registered, register one now
          if(!alarmRegistered)
          {
            if(TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              SibTr.debug(tc, "addNewMessage", "Registering MessageLock Expiry alarm for: " + nextMsgToExpire);
  
            alarmManager.create(messageLockExpiry, this);
            alarmRegistered = true;
          }
        }
  
        if (messageReferenceExpiry != 0)
        {
          if (messageLockExpiry != 0 && messageReferenceExpiry > messageLockExpiry)
          {
            // The messageReferenceExpiry is greater than the messageLockExpiry. There is no
            // point in creating the alarm for messageReferenceExpiry as the message lock expiry
            // will always go first.
            if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
            {
              SibTr.debug(tc, "MessageReferenceExpiry: "+messageReferenceExpiry+" is greater than messageLockExpiry: "+messageLockExpiry);
              SibTr.debug(tc, "MessageReferneceExpiry Alarm not registered");
            }
          }
          else
          {
            try
            {
              if (message.getReportCOD() == null)
              {
                // Now register the message reference expiry alarm
                // If there are no other message references expiring, this will be the first one
                if(nextMsgReferenceToExpire == null)
                  nextMsgReferenceToExpire = newElement;
  
                // If we don't have an alarm registered, register one now
                if(!msgReferenceAlarmRegistered)
                {
                  if(TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                    SibTr.debug(tc, "addNewMessage", "Registering MessageReference Expiry alarm for: " + nextMsgReferenceToExpire);
  
                  alarmManager.create(messageReferenceExpiry, new MessageReferenceExpiryAlarm());
                  msgReferenceAlarmRegistered = true;
                }
              }
            }
            catch(SIResourceException e)
            {
              // No FFDC code needed
  
              // There was a problem getting hold of the ReportCOD of the message
              // assume it is set and don't create the expiry alarm.
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                SibTr.debug(tc, "Thrown exception when trying to create msg ref expiry alarm: " + e);
            }
          }
       }
  
        // By adding a message we must be about to call consumeMessages and therefore
        // we're in a valid state for calls
        validState = true;
      } // synchronized
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "addNewMessage", this);
    }