fhanik      2004/01/11 21:21:48

  Modified:    catalina/src/share/org/apache/catalina Manager.java
               catalina/src/share/org/apache/catalina/core
                        StandardContext.java
               catalina/src/share/org/apache/catalina/session
                        StandardManager.java
  Log:
  Refactoring parts of the code. In order for custom managers (such as the clustering 
managers) to take advantage of the background threads that are already implemented, it 
is better to have the Manager interface to expose the backgroundProcess method. That 
way the context can invoke any other manager in a similar way.
  I opted for this way instead of using reflection. Yell if you don't like it, and I 
will change it back.
  
  Revision  Changes    Path
  1.4       +11 -5     
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/Manager.java
  
  Index: Manager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/Manager.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Manager.java      9 Dec 2002 15:57:43 -0000       1.3
  +++ Manager.java      12 Jan 2004 05:21:48 -0000      1.4
  @@ -186,7 +186,7 @@
        * Get a session from the recycled ones or create a new empty one.
        * The PersistentManager manager does not need to create session data
        * because it reads it from the Store.
  -     */                                                                         
  +     */
       public Session createEmptySession();
   
       /**
  @@ -260,5 +260,11 @@
        */
       public void unload() throws IOException;
   
  +    /**
  +     * This method will be invoked by the context/container on a periodic
  +     * basis and allows the manager to implement
  +     * a method that executes periodic tasks, such as expiring sessions etc.
  +     */
  +    public void backgroundProcess();
   
   }
  
  
  
  1.105     +124 -125  
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java
  
  Index: StandardContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java,v
  retrieving revision 1.104
  retrieving revision 1.105
  diff -u -r1.104 -r1.105
  --- StandardContext.java      5 Jan 2004 08:46:20 -0000       1.104
  +++ StandardContext.java      12 Jan 2004 05:21:48 -0000      1.105
  @@ -71,6 +71,7 @@
   import java.io.InputStreamReader;
   import java.io.ObjectOutputStream;
   import java.io.Serializable;
  +import java.lang.reflect.Method;
   import java.net.URLDecoder;
   import java.util.ArrayList;
   import java.util.HashMap;
  @@ -206,14 +207,14 @@
       /**
        * The set of instantiated application event listener objects</code>.
        */
  -    private transient Object applicationEventListenersObjects[] = 
  +    private transient Object applicationEventListenersObjects[] =
           new Object[0];
   
   
       /**
        * The set of instantiated application lifecycle listener objects</code>.
        */
  -    private transient Object applicationLifecycleListenersObjects[] = 
  +    private transient Object applicationLifecycleListenersObjects[] =
           new Object[0];
   
   
  @@ -228,12 +229,12 @@
        * The application available flag for this Context.
        */
       private boolean available = false;
  -    
  +
       /**
  -     * The broadcaster that sends j2ee notifications. 
  +     * The broadcaster that sends j2ee notifications.
        */
       private NotificationBroadcasterSupport broadcaster = null;
  -    
  +
       /**
        * The Locale to character set mapper for this application.
        */
  @@ -303,7 +304,7 @@
       private String displayName = null;
   
   
  -    /** 
  +    /**
        * Override the default web xml location. ContextConfig is not configurable
        * so the setter is not used.
        */
  @@ -373,7 +374,7 @@
       /**
        * The mapper associated with this context.
        */
  -    private org.apache.tomcat.util.http.mapper.Mapper mapper = 
  +    private org.apache.tomcat.util.http.mapper.Mapper mapper =
           new org.apache.tomcat.util.http.mapper.Mapper();
   
   
  @@ -491,7 +492,7 @@
        * The notification sequence number.
        */
       private long sequenceNumber = 0;
  -    
  +
       /**
        * The status code error pages for this web application, keyed by
        * HTTP status code (as an Integer).
  @@ -622,7 +623,7 @@
       private long tldScanTime;
   
       /** Name of the engine. If null, the domain is used.
  -     */ 
  +     */
       private String engineName = null;
       private String j2EEApplication="none";
       private String j2EEServer="none";
  @@ -1307,7 +1308,7 @@
   
       }
   
  -    
  +
       /**
        * Set the context path for this Context.
        * <p>
  @@ -1645,9 +1646,9 @@
   
       /** Get the absolute path to the work dir.
        *  To avoid duplication.
  -     * 
  +     *
        * @return
  -     */ 
  +     */
       public String getWorkPath() {
           File workDir = new File(getWorkDir());
           if (!workDir.isAbsolute()) {
  @@ -1662,7 +1663,7 @@
           }
           return workDir.getAbsolutePath();
       }
  -    
  +
       /**
        * Return the work directory for this Context.
        */
  @@ -1760,7 +1761,7 @@
           String jspFile = wrapper.getJspFile();
           if ((jspFile != null) && !jspFile.startsWith("/")) {
               if (isServlet22()) {
  -                log.debug(sm.getString("standardContext.wrapper.warning", 
  +                log.debug(sm.getString("standardContext.wrapper.warning",
                                          jspFile));
                   wrapper.setJspFile("/" + jspFile);
               } else {
  @@ -2567,8 +2568,8 @@
       public Context findMappingObject() {
           return (Context) getMappingObject();
       }
  -    
  -    
  +
  +
       /**
        * Return the message destination with the specified name, if any;
        * otherwise, return <code>null</code>.
  @@ -3865,9 +3866,9 @@
               }
               // Register the cache in JMX
               if (isCachingAllowed()) {
  -                ObjectName resourcesName = 
  -                    new ObjectName(this.getDomain() + ":type=Cache,host=" 
  -                                   + getHostname() + ",path=" 
  +                ObjectName resourcesName =
  +                    new ObjectName(this.getDomain() + ":type=Cache,host="
  +                                   + getHostname() + ",path="
                                      + (("".equals(getPath()))?"/":getPath()));
                   Registry.getRegistry().registerComponent
                       (proxyDirContext.getCache(), resourcesName, null);
  @@ -3900,10 +3901,10 @@
                   }
                   // Unregister the cache in JMX
                   if (isCachingAllowed()) {
  -                    ObjectName resourcesName = 
  +                    ObjectName resourcesName =
                           new ObjectName(this.getDomain()
  -                                       + ":type=Cache,host=" 
  -                                       + getHostname() + ",path=" 
  +                                       + ":type=Cache,host="
  +                                       + getHostname() + ",path="
                                          + (("".equals(getPath()))?"/"
                                             :getPath()));
                       Registry.getRegistry().unregisterComponent(resourcesName);
  @@ -3983,14 +3984,14 @@
               log.info(sm.getString("containerBase.alreadyStarted", logName()));
               return;
           }
  -        if( !initialized ) { 
  +        if( !initialized ) {
               try {
                   init();
               } catch( Exception ex ) {
                   throw new LifecycleException("Error initializaing ", ex);
               }
           }
  -        
  +
           String logName = "tomcat." + getParent().getName() + "." +
               ("".equals(getName()) ? "ROOT" : getName()) + ".Context";
           log = org.apache.commons.logging.LogFactory.getLog(logName);
  @@ -4000,7 +4001,7 @@
           // Set JMX object name for proper pipeline registration
           preRegisterJMX();
   
  -        if ((oname != null) && 
  +        if ((oname != null) &&
               (Registry.getRegistry().getMBeanServer().isRegistered(oname))) {
               // As things depend on the JMX registration, the context
               // must be reregistered again once properly initialized
  @@ -4028,7 +4029,7 @@
                           appBaseFile = new File(engineBase(), getAppBase());
                       }
                       String appBase = appBaseFile.getCanonicalPath();
  -                    String basePath = 
  +                    String basePath =
                           (new File(getBasePath())).getCanonicalPath();
                       if (!basePath.startsWith(appBase)) {
                           Server server = ServerFactory.getServer();
  @@ -4039,11 +4040,11 @@
                   }
               } else {
                   try {
  -                    String canConfigFile = 
  +                    String canConfigFile =
                           (new File(getConfigFile())).getCanonicalPath();
                       if (!canConfigFile.startsWith
                           (configBase.getCanonicalPath())) {
  -                        File file = 
  +                        File file =
                               new File(configBase, getDefaultConfigFile());
                           if (copy(new File(canConfigFile), file)) {
                               setConfigFile(file.getPath());
  @@ -4088,24 +4089,24 @@
               }
           }
   
  -        // Look for a realm - that may have been configured earlier. 
  +        // Look for a realm - that may have been configured earlier.
           // If the realm is added after context - it'll set itself.
           if( realm == null ) {
               ObjectName realmName=null;
               try {
  -                realmName=new ObjectName( getEngineName() + ":type=Host,host=" + 
  +                realmName=new ObjectName( getEngineName() + ":type=Host,host=" +
                           getHostname() + ",path=" + getPath());
                   if( mserver.isRegistered(realmName ) ) {
  -                    mserver.invoke(realmName, "init", 
  +                    mserver.invoke(realmName, "init",
                               new Object[] {},
                               new String[] {}
  -                    );            
  +                    );
                   }
               } catch( Throwable t ) {
                   log.debug("No realm for this host " + realmName);
               }
           }
  -        
  +
           if (getLoader() == null) {
               ClassLoader parent = null;
               if (getPrivileged()) {
  @@ -4215,7 +4216,7 @@
                   try {
                       tldConfig.execute();
                   } catch (Exception ex) {
  -                    log.error("Error reading tld listeners " 
  +                    log.error("Error reading tld listeners "
                                 + ex.toString(), ex);
                       //ok=false;
                   }
  @@ -4313,16 +4314,16 @@
           }
   
           startTime=System.currentTimeMillis();
  -        
  -        // Send j2ee.state.running notification 
  +
  +        // Send j2ee.state.running notification
           if (ok && (this.getObjectName() != null)) {
  -            Notification notification = 
  -                new Notification("j2ee.state.running", this.getObjectName(), 
  +            Notification notification =
  +                new Notification("j2ee.state.running", this.getObjectName(),
                                   sequenceNumber++);
               broadcaster.sendNotification(notification);
           }
   
  -        // Close all JARs right away to avoid always opening a peak number 
  +        // Close all JARs right away to avoid always opening a peak number
           // of files on startup
           if (getLoader() instanceof WebappLoader) {
               ((WebappLoader) getLoader()).closeJARs(true);
  @@ -4335,11 +4336,11 @@
   
           //cacheContext();
       }
  -    
  +
       private void cacheContext() {
           try {
               File workDir=new File( getWorkPath() );
  -            
  +
               File ctxSer=new File( workDir, "_tomcat_context.ser");
               FileOutputStream fos=new FileOutputStream( ctxSer );
               ObjectOutputStream oos=new ObjectOutputStream( fos );
  @@ -4366,27 +4367,27 @@
           try {
               // Stop our filters
               filterStop();
  -            
  +
               // Finalize our character set mapper
               setCharsetMapper(null);
  -            
  +
               // Stop our application listeners
               listenerStop();
  -            
  +
               // Stop resources
               resourcesStop();
  -            
  +
               super.stop();
           } finally {
  -            
  +
               // Unbinding thread
               unbindThread(oldCCL);
  -            
  +
           }
  -        
  +
           // Reset application context
           context = null;
  -        
  +
           wrappers = new ArrayList();
       }
   
  @@ -4407,15 +4408,15 @@
   
           // Notify our interested LifecycleListeners
           lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);
  -        
  -        // Send j2ee.state.stopping notification 
  +
  +        // Send j2ee.state.stopping notification
           if (this.getObjectName() != null) {
  -            Notification notification = 
  -                new Notification("j2ee.state.stopping", this.getObjectName(), 
  +            Notification notification =
  +                new Notification("j2ee.state.stopping", this.getObjectName(),
                                   sequenceNumber++);
               broadcaster.sendNotification(notification);
           }
  -        
  +
           // Mark this application as unavailable while we shut down
           setAvailable(false);
   
  @@ -4482,26 +4483,26 @@
   
           }
   
  -        // Send j2ee.state.stopped notification 
  +        // Send j2ee.state.stopped notification
           if (this.getObjectName() != null) {
  -            Notification notification = 
  -                new Notification("j2ee.state.stopped", this.getObjectName(), 
  +            Notification notification =
  +                new Notification("j2ee.state.stopped", this.getObjectName(),
                                   sequenceNumber++);
               broadcaster.sendNotification(notification);
           }
  -        
  +
           // Reset application context
           context = null;
   
           wrappers = new ArrayList();
   
  -        // This object will no longer be visible or used. 
  +        // This object will no longer be visible or used.
           try {
               resetContext();
           } catch( Exception ex ) {
               log.error( "Error reseting context " + this + " " + ex, ex );
           }
  -        
  +
           // Notify our interested LifecycleListeners
           lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null);
   
  @@ -4511,28 +4512,28 @@
       }
   
       /** Destroy needs to clean up the context completely.
  -     * 
  -     * The problem is that undoing all the config in start() and restoring 
  +     *
  +     * The problem is that undoing all the config in start() and restoring
        * a 'fresh' state is impossible. After stop()/destroy()/init()/start()
        * we should have the same state as if a fresh start was done - i.e
  -     * read modified web.xml, etc. This can only be done by completely 
  +     * read modified web.xml, etc. This can only be done by completely
        * removing the context object and remapping a new one, or by cleaning
        * up everything.
  -     * 
  +     *
        * XXX Should this be done in stop() ?
  -     * 
  -     */ 
  +     *
  +     */
       public void destroy() throws Exception {
  -        if( oname != null ) { 
  -            // Send j2ee.object.deleted notification 
  -            Notification notification = 
  -                new Notification("j2ee.object.deleted", this.getObjectName(), 
  +        if( oname != null ) {
  +            // Send j2ee.object.deleted notification
  +            Notification notification =
  +                new Notification("j2ee.object.deleted", this.getObjectName(),
                                   sequenceNumber++);
               broadcaster.sendNotification(notification);
  -        } 
  +        }
           super.destroy();
       }
  -    
  +
       private void resetContext() throws Exception, MBeanRegistrationException {
           // Restore the original state ( pre reading web.xml in start )
           // If you extend this - override this method and make sure to clean up
  @@ -4571,12 +4572,10 @@
           count = (count + 1) % managerChecksFrequency;
   
           if ((getManager() != null) && (count == 0)) {
  -            if (getManager() instanceof StandardManager) {
  -                ((StandardManager) getManager()).processExpires();
  -            } else if (getManager() instanceof PersistentManagerBase) {
  -                PersistentManagerBase pManager = 
  -                    (PersistentManagerBase) getManager();
  -                pManager.backgroundProcess();
  +            try {
  +                getManager().backgroundProcess();
  +            } catch ( Exception x ) {
  +                log.error("Unable to execute the managers background process",x);
               }
           }
   
  @@ -4764,7 +4763,7 @@
        * Get config base.
        */
       private File getConfigBase() {
  -        File configBase = 
  +        File configBase =
               new File(System.getProperty("catalina.base"), "conf");
           if (!configBase.exists()) {
               return null;
  @@ -5182,14 +5181,14 @@
               MBeanUtils.createObjectName(managed.getDomain(), resourceLink);
           return (oname.toString());
       }
  -    
  -    
  +
  +
       /** JSR77 deploymentDescriptor attribute
        *
  -     * @return string deployment descriptor 
  +     * @return string deployment descriptor
        */
       public String getDeploymentDescriptor() {
  -    
  +
           InputStream stream = null;
           ServletContext servletContext = getServletContext();
           if (servletContext != null) {
  @@ -5212,11 +5211,11 @@
               return "";
           }
   
  -        return sb.toString(); 
  -    
  +        return sb.toString();
  +
       }
  -    
  -    
  +
  +
       /** JSR77 servlets attribute
        *
        * @return list of all servlets ( we know about )
  @@ -5229,14 +5228,14 @@
           }
           return result;
       }
  -    
  +
   
       public ObjectName createObjectName(String hostDomain, ObjectName parentName)
               throws MalformedObjectNameException
       {
           String onameStr;
           StandardHost hst=(StandardHost)getParent();
  -        
  +
           String pathName=getName();
           String hostName=getParent().getName();
           String name= "//" + ((hostName==null)? "DEFAULT" : hostName) +
  @@ -5249,18 +5248,18 @@
           onameStr="j2eeType=WebModule,name=" + name + suffix;
           if( log.isDebugEnabled())
               log.debug("Registering " + onameStr + " for " + oname);
  -        
  +
           // default case - no domain explictely set.
           if( getDomain() == null ) domain=hst.getDomain();
   
           ObjectName oname=new ObjectName(getDomain() + ":" + onameStr);
  -        return oname;        
  -    }    
  -    
  +        return oname;
  +    }
  +
       private void preRegisterJMX() {
           try {
               StandardHost host = (StandardHost) getParent();
  -            if ((oname == null) 
  +            if ((oname == null)
                   || (oname.getKeyProperty("j2eeType") == null)) {
                   oname = createObjectName(host.getDomain(), host.getJmxName());
                   controller = oname;
  @@ -5279,12 +5278,12 @@
               if(! Registry.getRegistry().getMBeanServer().isRegistered(oname)) {
                   controller = oname;
                   Registry.getRegistry().registerComponent(this, oname, null);
  -                
  -                // Send j2ee.object.created notification 
  +
  +                // Send j2ee.object.created notification
                   if (this.getObjectName() != null) {
                       Notification notification = new Notification(
  -                                                        "j2ee.object.created", 
  -                                                        this.getObjectName(), 
  +                                                        "j2ee.object.created",
  +                                                        this.getObjectName(),
                                                           sequenceNumber++);
                       broadcaster.sendNotification(notification);
                   }
  @@ -5337,7 +5336,7 @@
   
           if( this.getParent() == null ) {
               ObjectName parentName=getParentName();
  -            
  +
               if( ! mserver.isRegistered(parentName)) {
                   log.debug("No host, creating one " + parentName);
                   StandardHost host=new StandardHost();
  @@ -5358,15 +5357,15 @@
               }
           }
           super.init();
  -        
  -        // Send j2ee.state.starting notification 
  +
  +        // Send j2ee.state.starting notification
           if (this.getObjectName() != null) {
  -            Notification notification = new Notification("j2ee.state.starting", 
  -                                                        this.getObjectName(), 
  +            Notification notification = new Notification("j2ee.state.starting",
  +                                                        this.getObjectName(),
                                                           sequenceNumber++);
               broadcaster.sendNotification(notification);
           }
  -        
  +
       }
   
       public ObjectName getParentName() throws MalformedObjectNameException {
  @@ -5401,7 +5400,7 @@
                   "type=Host,host=" + hostName);
           return parentName;
       }
  -    
  +
       public void create() throws Exception{
           init();
       }
  @@ -5421,7 +5420,7 @@
   
       /**
        * Return the naming resources associated with this web application.
  -     * FIXME: Fooling introspection ... 
  +     * FIXME: Fooling introspection ...
        */
       public javax.naming.directory.DirContext findStaticResources() {
   
  @@ -5441,68 +5440,68 @@
   
   
   
  -    /** Support for "stateManageable" JSR77 
  -     * 
  +    /** Support for "stateManageable" JSR77
  +     *
        */
       public boolean isStateManageable() {
           return true;
       }
  -    
  +
       public void startRecursive() throws LifecycleException {
           // nothing to start recursive, the servlets will be started by 
load-on-startup
           start();
       }
  -    
  +
       public int getState() {
           if( started ) {
               return 1; // RUNNING
           }
           if( initialized ) {
  -            return 0; // starting ? 
  +            return 0; // starting ?
           }
  -        if( ! available ) { 
  +        if( ! available ) {
               return 4; //FAILED
           }
           // 2 - STOPPING
           return 3; // STOPPED
       }
  -    
  +
       /**
        * The J2EE Server ObjectName this module is deployed on.
  -     */     
  +     */
       private String server = null;
  -    
  +
       /**
        * The Java virtual machines on which this module is running.
  -     */       
  +     */
       private String[] javaVMs = null;
  -    
  +
       public String getServer() {
           return server;
       }
  -        
  +
       public String setServer(String server) {
           return this.server=server;
       }
  -        
  +
       public String[] getJavaVMs() {
           return javaVMs;
       }
  -        
  +
       public String[] setJavaVMs(String[] javaVMs) {
           return this.javaVMs = javaVMs;
       }
  -    
  +
       public long getStartTime() {
           return startupTime;
       }
  -    
  +
       public boolean isEventProvider() {
           return false;
       }
  -    
  +
       public boolean isStatisticsProvider() {
           return false;
       }
  -    
  +
   }
  
  
  
  1.18      +32 -25    
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardManager.java
  
  Index: StandardManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardManager.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- StandardManager.java      10 Dec 2003 23:00:36 -0000      1.17
  +++ StandardManager.java      12 Jan 2004 05:21:48 -0000      1.18
  @@ -116,15 +116,15 @@
       private class PrivilegedDoLoad
           implements PrivilegedExceptionAction {
   
  -        PrivilegedDoLoad() {           
  +        PrivilegedDoLoad() {
           }
   
           public Object run() throws Exception{
              doLoad();
              return null;
  -        }                       
  +        }
       }
  -        
  +
       private class PrivilegedDoUnload
           implements PrivilegedExceptionAction {
   
  @@ -134,11 +134,11 @@
           public Object run() throws Exception{
               doUnload();
               return null;
  -        }            
  -           
  -    }        
  +        }
  +
  +    }
  +
   
  -    
       // ----------------------------------------------------- Instance Variables
   
   
  @@ -372,7 +372,7 @@
        * @exception IOException if an input/output error occurs
        */
       public void load() throws ClassNotFoundException, IOException {
  -        if (System.getSecurityManager() != null){   
  +        if (System.getSecurityManager() != null){
               try{
                   AccessController.doPrivileged( new PrivilegedDoLoad() );
               } catch (PrivilegedActionException ex){
  @@ -384,11 +384,11 @@
                   }
                   if (log.isDebugEnabled())
                       log.debug("Unreported exception in load() "
  -                        + exception);                
  +                        + exception);
               }
           } else {
               doLoad();
  -        }       
  +        }
       }
   
   
  @@ -401,7 +401,7 @@
        *  found during the reload
        * @exception IOException if an input/output error occurs
        */
  -    protected void doLoad() throws ClassNotFoundException, IOException {    
  +    protected void doLoad() throws ClassNotFoundException, IOException {
           if (log.isDebugEnabled())
               log.debug("Start: Loading persisted sessions");
   
  @@ -515,7 +515,7 @@
        * @exception IOException if an input/output error occurs
        */
       public void unload() throws IOException {
  -        if (System.getSecurityManager() != null){       
  +        if (System.getSecurityManager() != null){
               try{
                   AccessController.doPrivileged( new PrivilegedDoUnload() );
               } catch (PrivilegedActionException ex){
  @@ -525,14 +525,14 @@
                   }
                   if (log.isDebugEnabled())
                       log.debug("Unreported exception in unLoad() "
  -                        + exception);                
  -            }        
  +                        + exception);
  +            }
           } else {
               doUnload();
  -        }       
  +        }
       }
  -        
  -        
  +
  +
       /**
        * Save any currently active sessions in the appropriate persistence
        * mechanism, if any.  If persistence is not supported, this method
  @@ -540,7 +540,7 @@
        *
        * @exception IOException if an input/output error occurs
        */
  -    protected void doUnload() throws IOException {   
  +    protected void doUnload() throws IOException {
   
           if (log.isDebugEnabled())
               log.debug("Unloading persisted sessions");
  @@ -650,7 +650,7 @@
   
   
       /**
  -     * Get the lifecycle listeners associated with this lifecycle. If this 
  +     * Get the lifecycle listeners associated with this lifecycle. If this
        * Lifecycle has no listeners registered, a zero-length array is returned.
        */
       public LifecycleListener[] findLifecycleListeners() {
  @@ -683,7 +683,7 @@
   
           if( ! initialized )
               init();
  -        
  +
           // Validate and update our current component state
           if (started) {
               return;
  @@ -720,7 +720,7 @@
   
           if (log.isDebugEnabled())
               log.debug("Stopping");
  -        
  +
           // Validate and update our current component state
           if (!started)
               throw new LifecycleException
  @@ -832,6 +832,13 @@
           long timeEnd = System.currentTimeMillis();
           processingTime += ( timeEnd - timeNow );
   
  +    }
  +
  +    /**
  +     * Implements the Manager interface, direct call to processExpires
  +     */
  +    public void backgroundProcess() {
  +        processExpires();
       }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to