Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@apache.org Received: (qmail 51738 invoked from network); 22 May 2003 23:04:29 -0000 Received: from exchange.sun.com (192.18.33.10) by daedalus.apache.org with SMTP; 22 May 2003 23:04:29 -0000 Received: (qmail 25754 invoked by uid 97); 22 May 2003 23:06:45 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-dev@nagoya.betaversion.org Received: (qmail 25747 invoked from network); 22 May 2003 23:06:44 -0000 Received: from daedalus.apache.org (HELO apache.org) (208.185.179.12) by nagoya.betaversion.org with SMTP; 22 May 2003 23:06:44 -0000 Received: (qmail 50867 invoked by uid 500); 22 May 2003 23:04:20 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Developers List" Reply-To: "Tomcat Developers List" Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 50856 invoked by uid 500); 22 May 2003 23:04:20 -0000 Received: (qmail 50853 invoked from network); 22 May 2003 23:04:20 -0000 Received: from icarus.apache.org (208.185.179.13) by daedalus.apache.org with SMTP; 22 May 2003 23:04:20 -0000 Received: (qmail 29695 invoked by uid 1135); 22 May 2003 23:04:19 -0000 Date: 22 May 2003 23:04:19 -0000 Message-ID: <20030522230419.29694.qmail@icarus.apache.org> From: remm@apache.org To: jakarta-tomcat-catalina-cvs@apache.org Subject: cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core ContainerBase.java StandardContext.java StandardEngine.java StandardHost.java StandardServer.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N remm 2003/05/22 16:04:19 Modified: catalina/src/share/org/apache/catalina/core ContainerBase.java StandardContext.java StandardEngine.java StandardHost.java StandardServer.java Log: - Refactor the host deployer, session manager, webapp reloading threads into one (potentially) thread at the engine level. - The thread code is in StandardEngine, but can be refactored into StandardServer, in case we want to be able to have one thread for the whole server. The main adavantage of putting the code in container is that additional threads can be associated to branches of the container tree (ex: associate one thread per host, one thread for a specific context, etc ...). - The container's CL (if present) will be set as the context classloader before invoking the execute method, and will be restored afterwards. - I couldn't come up with good neams for the new field and the thread name. Can you help ? - By default, the engine will have a thread with a 10s delay. Revision Changes Path 1.23 +156 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ContainerBase.java Index: ContainerBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ContainerBase.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- ContainerBase.java 19 May 2003 22:45:23 -0000 1.22 +++ ContainerBase.java 22 May 2003 23:04:18 -0000 1.23 @@ -208,6 +208,12 @@ /** + * The execute delay for this component. + */ + protected int executeDelay = -1; + + + /** * The lifecycle event support for this component. */ protected LifecycleSupport lifecycle = new LifecycleSupport(this); @@ -299,6 +305,18 @@ protected PropertyChangeSupport support = new PropertyChangeSupport(this); + /** + * The background thread. + */ + private Thread thread = null; + + + /** + * The background thread completion semaphore. + */ + private boolean threadDone = false; + + // ------------------------------------------------------------- Properties @@ -328,6 +346,32 @@ /** + * Get the delay between the invocation of the execute method on + * this container and its children. Child containers will not be invoked + * if their delay value is not -1 (which would mean they are using their + * own thread). Setting this to a positive value will cause a thread to + * be spawn. After waiting the specified amount of time, the thread will + * invoke the executePeriodic method on this container and all + * its children. + */ + public int getExecuteDelay() { + return executeDelay; + } + + + /** + * Set the delay between the invocation of the execute method on this + * container and its children. + * + * @param delay The delay in seconds between the invocation of execute + * methods + */ + public void setExecuteDelay(int executeDelay) { + this.executeDelay = executeDelay; + } + + + /** * Return descriptive information about this Container implementation and * the corresponding version number, in the format * <description>/<version>. @@ -1090,6 +1134,9 @@ // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(START_EVENT, null); + // Start our thread + threadStart(); + // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null); @@ -1113,6 +1160,9 @@ // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null); + // Stop out thread + threadStop(); + // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(STOP_EVENT, null); started = false; @@ -1316,6 +1366,14 @@ } + /** + * Execute a periodic task, such as reloading, etc. This method will be + * invoked inside the classloading context of this container. Unexpected + * throwables will be caught and logged. + */ + public void execute() { + } + // ------------------------------------------------------ Protected Methods @@ -1516,5 +1574,102 @@ return suffix.toString(); } - + + /** + * Start the background thread that will periodically check for + * session timeouts. + */ + private void threadStart() { + + if (thread != null) + return; + if (executeDelay <= 0) + return; + + threadDone = false; + String threadName = "ExecuteDelay[" + getName() + "]"; + thread = new Thread(new ContainerExecuteDelay(), threadName); + thread.setDaemon(true); + thread.start(); + + } + + + /** + * Stop the background thread that is periodically checking for + * session timeouts. + */ + private void threadStop() { + + if (thread == null) + return; + + threadDone = true; + thread.interrupt(); + try { + thread.join(); + } catch (InterruptedException e) { + ; + } + + thread = null; + + } + + + // -------------------------------------- ContainerExecuteDelay Inner Class + + + /** + * Private thread class to invoke the execute method of this container + * and its children after a fixed delay. + */ + protected class ContainerExecuteDelay implements Runnable { + + + /** + * Perform the requested notification. + */ + public void run() { + while (!threadDone) { + try { + Thread.sleep(executeDelay * 1000L); + } catch (InterruptedException e) { + ; + } + if (!threadDone) { + Container parent = (Container) getMappingObject(); + ClassLoader cl = + Thread.currentThread().getContextClassLoader(); + if (parent.getLoader() != null) { + cl = parent.getLoader().getClassLoader(); + } + processChildren(parent, cl); + } + } + } + + protected void processChildren(Container container, ClassLoader cl) { + try { + if (container.getLoader() != null) { + Thread.currentThread().setContextClassLoader + (container.getLoader().getClassLoader()); + } + container.execute(); + } catch (Throwable t) { + log.error("Exception invoking periodic operation: ", t); + } finally { + Thread.currentThread().setContextClassLoader(cl); + } + Container[] children = container.findChildren(); + for (int i = 0; i < children.length; i++) { + if (children[i].getExecuteDelay() <= 0) { + processChildren(children[i], cl); + } + } + } + + } + + } 1.58 +25 -1 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.57 retrieving revision 1.58 diff -u -r1.57 -r1.58 --- StandardContext.java 22 May 2003 18:20:03 -0000 1.57 +++ StandardContext.java 22 May 2003 23:04:18 -0000 1.58 @@ -4392,6 +4392,30 @@ } + /** + * Execute a periodic task, such as reloading, etc. This method will be + * invoked inside the classloading context of this container. Unexpected + * throwables will be caught and logged. + */ + public void execute() { + + if (!started) + return; + + if ((getManager() != null) + && (getManager() instanceof StandardManager)) { + ((StandardManager) getManager()).processExpires(); + } + + if (reloadable && (getLoader() != null)) { + if (getLoader().modified()) { + reload(); + } + } + + } + + // ------------------------------------------------------ Protected Methods 1.20 +3 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardEngine.java Index: StandardEngine.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardEngine.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- StandardEngine.java 19 May 2003 22:45:24 -0000 1.19 +++ StandardEngine.java 22 May 2003 23:04:18 -0000 1.20 @@ -111,6 +111,8 @@ setJvmRoute(System.getProperty("jvmRoute")); } catch(Exception ex) { } + // By default, the engine will hold the reloading thread + executeDelay = 10; } 1.15 +11 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardHost.java Index: StandardHost.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardHost.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- StandardHost.java 19 May 2003 22:45:24 -0000 1.14 +++ StandardHost.java 22 May 2003 23:04:18 -0000 1.15 @@ -774,6 +774,16 @@ } + /** + * Execute a periodic task, such as reloading, etc. This method will be + * invoked inside the classloading context of this container. Unexpected + * throwables will be caught and logged. + */ + public void execute() { + lifecycle.fireLifecycleEvent("check", null); + } + + // ------------------------------------------------------- Deployer Methods 1.17 +5 -7 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardServer.java Index: StandardServer.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardServer.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- StandardServer.java 22 Apr 2003 17:13:22 -0000 1.16 +++ StandardServer.java 22 May 2003 23:04:18 -0000 1.17 @@ -927,8 +927,7 @@ return (false); } WebappLoader wloader = (WebappLoader) loader; - if ((wloader.getCheckInterval() != 15) || - (wloader.getDebug() != 0) || + if ((wloader.getDebug() != 0) || (wloader.getDelegate() != false) || !wloader.getLoaderClass().equals ("org.apache.catalina.loader.WebappClassLoader")) { @@ -953,7 +952,6 @@ StandardManager smanager = (StandardManager) manager; if ((smanager.getDebug() != 0) || !smanager.getPathname().equals("SESSIONS.ser") || - (smanager.getCheckInterval() != 60) || !smanager.getRandomClass().equals("java.security.SecureRandom") || (smanager.getMaxActiveSessions() != -1) || !smanager.getAlgorithm().equals("MD5")) { --------------------------------------------------------------------- To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org