docs: public final void start(long expiryInterval, JsMessagingEngine jsme) throws SevereMessageStoreException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "start", "interval=" + expiryInterval + " indexSize=" + expiryIndex.size());
  
          messagingEngine = jsme;
  
          if (expiryInterval >= 0) // If an expiry interval was given, use it
          {
              interval = expiryInterval;
          }
          else // Otherwise, get it from the system property
          {
              // Get property for expiry interval
              String value =
              messageStore.getProperty(
                                      MessageStoreConstants.PROP_EXPIRY_INTERVAL,
                                      MessageStoreConstants.PROP_EXPIRY_INTERVAL_DEFAULT);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "start", "Value from property=<" + value + ">");
  
              try
              {
                  this.interval = Long.parseLong(value.trim());
              }
              catch (NumberFormatException e)
              {
                  // No FFDC Code Needed.
                  lastException = e;
                  lastExceptionTime = timeNow();
                  SibTr.debug(this, tc, "start", "Unable to parse property: " + e);
                  this.interval = 1000; // Use hard coded default as last resort
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "start", "expiryInterval=" + this.interval);
  
          // about to tinker with various variables so take the lock now
          synchronized (lockObject)
          {
              if (interval < 1)
              {
                  runEnabled = false; 
                  addEnabled = false;
              }
              else
              {
                  if (expiryAlarm == null)
                  {
                      runEnabled = true;
                      addEnabled = true;
                      expirerStartTime = timeNow();
                      // Now we look at the size of the index and only schedule the first
                      // alarm if the index is not empty. Remember that expirables can be
                      // added BEFORE the expirer is started so it may not be empty.
                      if (expiryIndex.size() > 0) // If the index is not empty,
                      {
                          scheduleAlarm(interval); // ... schedule the first alarm.  
                      }
                  }
                  else
                  {
                      // Expiry thread already running
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Expiry already started");
  
                      SevereMessageStoreException e = new SevereMessageStoreException("EXPIRY_THREAD_ALREADY_RUNNING_SIMS2004");
                      lastException = e;
                      lastExceptionTime = timeNow();
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "start");
                      throw e;
                  }
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "start", "runEnabled=" + runEnabled + " addEnabled=" + addEnabled + " interval=" + interval);
      }