code: public synchronized final void stop()
      	throws InterruptedException
      {
          if (!_started || _stopping)
              return;
          _stopping=true;
  
          if (log.isDebugEnabled()) log.debug("Stopping "+this);
          LifeCycleEvent event = new LifeCycleEvent(this);
          for(int i=0;i<LazyList.size(_eventListeners);i++)
          {
              EventListener listener=(EventListener)LazyList.get(_eventListeners,i);
              if (listener instanceof LifeCycleListener)
                  ((LifeCycleListener)listener).lifeCycleStopping(event);
          }
          
          try
          {	
              doStop();
              _started=false;
              log.info("Stopped "+this);
              for(int i=0;i<LazyList.size(_eventListeners);i++)
              {
                  EventListener listener=(EventListener)LazyList.get(_eventListeners,i);
                  if (listener instanceof LifeCycleListener)
                      ((LifeCycleListener)listener).lifeCycleStopped(event);
              }
          }
          catch(Throwable e)
          {
              event = new LifeCycleEvent(this,e);
              for(int i=0;i<LazyList.size(_eventListeners);i++)
              {
                  EventListener listener=(EventListener)LazyList.get(_eventListeners,i);
                  if (listener instanceof LifeCycleListener)
                      ((LifeCycleListener)listener).lifeCycleFailure(event);
              }
              if (e instanceof InterruptedException)
                  throw (InterruptedException)e;
              if (e instanceof RuntimeException)
                  throw (RuntimeException)e;
              if (e instanceof Error)
                  throw (Error)e;
              log.warn(LogSupport.EXCEPTION, e);
          }
          finally
          {
              _stopping=false;
          }
      }
docs: Stop the container.
  Generate LifeCycleEvents for stopping and stopped either side of a call to doStop