docs: public void start()
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "start: " + this);
  
          EJBModuleMetaDataImpl ejbModuleMetaData = ivBMD._moduleMetaData;
          EJBApplicationMetaData ejbAmd = ejbModuleMetaData.getEJBApplicationMetaData();
  
          // Synchronization must insure a destroyed timer is not placed in the
          // active timers map.                                            RTC107334
          synchronized (this)
          {
              // If the application is stopping/stopped, then the timer should neither
              // be active nor scheduled; move to destroyed.
              if (ejbAmd.isStopping()) {
                  if (isTraceOn && tc.isEntryEnabled())
                      Tr.exit(tc, "start: not started - application stop");
                  ivDestroyed = true;
                  return;
              }
  
              // If this is a single-action timer which is already destroyed,
              // then return without creating another Alarm.  It's lifecycle is over.
              // F7437591.codRev - Alternatively, if this is a calendar-based timer
              // with no expirations, don't create the alarm.
              if (ivDestroyed || ivExpiration == 0)
              {
                  if (isTraceOn && tc.isEntryEnabled())
                      Tr.exit(tc, "start: not started - destroyed = " + ivDestroyed + ", expiration = " + ivExpiration);
                  return;
              }
  
              synchronized (svActiveTimers)
              {
                  svActiveTimers.put(ivTaskId, this);
              }
          }
  
          // Note that this is not synchronized. Just because a timer is considered
          // active does not mean it is scheduled. Scheduling will be synchronized
          // separately; and must insure a destroyed timer is not scheduled, nor
          // allow a timer to be scheduled multiple times.
  
          // Do not start the alarm for the timer until the application has fully
          // started. EJBApplicationMetaData controls when to queue or schedule. d589357
          boolean queuedOrStarted = ejbAmd.queueOrStartNonPersistentTimerAlarm(this, ejbModuleMetaData);
  
          // There is a small window where an application could begin stopping after the timer
          // has been added to the active list above but before the call to queue or start.
          // The queue or start method will return false if the application is now stopping,
          // so the timer needs to be removed from the active list to stay in sync.
          if (!queuedOrStarted) {
              remove(true);
          }
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "start");
      }