Author: rjung Date: Fri Oct 29 23:22:35 2010 New Revision: 1028940 URL: http://svn.apache.org/viewvc?rev=1028940&view=rev Log: Add new JSP init parameter "jspIdleTimeout".
If set > 0 (default -1), a background task will unload all JSPs being idle longer than this time in seconds. Modified: tomcat/trunk/java/org/apache/jasper/EmbeddedServletOptions.java tomcat/trunk/java/org/apache/jasper/JspC.java tomcat/trunk/java/org/apache/jasper/Options.java tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Modified: tomcat/trunk/java/org/apache/jasper/EmbeddedServletOptions.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/EmbeddedServletOptions.java?rev=1028940&r1=1028939&r2=1028940&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/EmbeddedServletOptions.java (original) +++ tomcat/trunk/java/org/apache/jasper/EmbeddedServletOptions.java Fri Oct 29 23:22:35 2010 @@ -189,11 +189,17 @@ public final class EmbeddedServletOption /** - * The maxim number of loaded jsps per web-application. If there are more + * The maximum number of loaded jsps per web-application. If there are more * jsps loaded, they will be unloaded. */ private int maxLoadedJsps = -1; + /** + * The idle time after which a JSP is unloaded. + * If unset or less or equal than 0, no jsps are unloaded. + */ + private int jspIdleTimeout = -1; + public String getProperty(String name ) { return settings.getProperty( name ); } @@ -391,14 +397,22 @@ public final class EmbeddedServletOption } /** - * Should any jsps be unloaded? If set to a value greater than 0 eviction of jsps - * is started. Default: -1 - * */ + * Should jsps be unloaded if to many are loaded? + * If set to a value greater than 0 eviction of jsps is started. Default: -1 + */ public int getMaxLoadedJsps() { return maxLoadedJsps; } /** + * Should any jsps be unloaded when being idle for to long? + * If set to a value greater than 0 eviction of jsps is started. Default: -1 + */ + public int getJspIdleTimeout() { + return jspIdleTimeout; + } + + /** * Create an EmbeddedServletOptions object using data available from * ServletConfig and ServletContext. */ @@ -689,6 +703,17 @@ public final class EmbeddedServletOption } } } + + String jspIdleTimeout = config.getInitParameter("jspIdleTimeout"); + if (jspIdleTimeout != null) { + try { + this.jspIdleTimeout = Integer.parseInt(jspIdleTimeout); + } catch(NumberFormatException ex) { + if (log.isWarnEnabled()) { + log.warn(Localizer.getMessage("jsp.warning.jspIdleTimeout", ""+this.jspIdleTimeout)); + } + } + } // Setup the global Tag Libraries location cache for this // web-application. Modified: tomcat/trunk/java/org/apache/jasper/JspC.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/JspC.java?rev=1028940&r1=1028939&r2=1028940&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/JspC.java (original) +++ tomcat/trunk/java/org/apache/jasper/JspC.java Fri Oct 29 23:22:35 2010 @@ -447,6 +447,10 @@ public class JspC implements Options { return -1; } + public int getJspIdleTimeout() { + return -1; + } + /** * {...@inheritdoc} */ Modified: tomcat/trunk/java/org/apache/jasper/Options.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/Options.java?rev=1028940&r1=1028939&r2=1028940&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/Options.java (original) +++ tomcat/trunk/java/org/apache/jasper/Options.java Fri Oct 29 23:22:35 2010 @@ -222,9 +222,15 @@ public interface Options { public Map<String, TagLibraryInfo> getCache(); /** - * The maxim number of loaded jsps per web-application. If there are more + * The maximum number of loaded jsps per web-application. If there are more * jsps loaded, they will be unloaded. If unset or less than 0, no jsps * are unloaded. */ public int getMaxLoadedJsps(); + + /** + * The idle time after which a JSP is unloaded. + * If unset or less or equal than 0, no jsps are unloaded. + */ + public int getJspIdleTimeout(); } Modified: tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java?rev=1028940&r1=1028939&r2=1028940&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java (original) +++ tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java Fri Oct 29 23:22:35 2010 @@ -160,6 +160,7 @@ public final class JspRuntimeContext { jspQueue = new FastRemovalDequeue<JspServletWrapper>(options.getMaxLoadedJsps()); } + jspIdleTimeout = options.getJspIdleTimeout() * 1000; } // ----------------------------------------------------- Instance Variables @@ -175,6 +176,7 @@ public final class JspRuntimeContext { private final String classpath; private volatile long lastCompileCheck = -1L; private volatile long lastJspQueueUpdate = System.currentTimeMillis(); + private long jspIdleTimeout; /** * Maps JSP pages to their JspServletWrapper's @@ -527,6 +529,22 @@ public final class JspRuntimeContext { */ public void checkUnload() { - lastJspQueueUpdate = System.currentTimeMillis(); + long now = System.currentTimeMillis(); + if (jspIdleTimeout > 0) { + long unloadBefore = now - jspIdleTimeout; + Object [] wrappers = jsps.values().toArray(); + for (int i = 0; i < wrappers.length; i++ ) { + JspServletWrapper jsw = (JspServletWrapper)wrappers[i]; + synchronized(jsw) { + if (jsw.getLastUsageTime() < unloadBefore) { + if (jspQueue != null) { + jspQueue.remove(jsw.getUnloadHandle()); + } + unloadJspServletWrapper(jsw); + } + } + } + } + lastJspQueueUpdate = now; } } Modified: tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties?rev=1028940&r1=1028939&r2=1028940&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties Fri Oct 29 23:22:35 2010 @@ -177,6 +177,7 @@ jsp.warning.genchararray=Warning: Invali jsp.warning.suppressSmap=Warning: Invalid value for the initParam suppressSmap. Will use the default value of \"false\" jsp.warning.displaySourceFragment=Warning: Invalid value for the initParam displaySourceFragment. Will use the default value of \"true\" jsp.warning.maxLoadedJsps=Warning: Invalid value for the initParam maxLoadedJsps. Will use the default value of \"-1\" +jsp.warning.jspIdleTimeout=Warning: Invalid value for the initParam jspIdleTimeout. Will use the default value of \"-1\" jsp.error.badtaglib=Unable to open taglibrary {0} : {1} jsp.error.badGetReader=Cannot create a reader when the stream is not buffered jsp.warning.unknown.element.in.taglib=Unknown element ({0}) in taglib @@ -470,4 +471,4 @@ jsp.warning.noJarScanner=Warning: No org jsp.error.bug48498=Unable to display JSP extract. Probably due to an XML parser bug (see Tomcat bug 48498 for details). # UniqueAttributesImpl -jsp.error.duplicateqname=An attribute with duplicate qualified name [{0}] was found. Attribute qualified names must be unique within an element. \ No newline at end of file +jsp.error.duplicateqname=An attribute with duplicate qualified name [{0}] was found. Attribute qualified names must be unique within an element. Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?rev=1028940&r1=1028939&r2=1028940&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java (original) +++ tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Fri Oct 29 23:22:35 2010 @@ -89,7 +89,9 @@ public class JspServletWrapper { private long lastModificationTest = 0L; private long lastUsageTime = System.currentTimeMillis(); private FastRemovalDequeue<JspServletWrapper>.Entry unloadHandle; + private final boolean unloadAllowed; private final boolean unloadByCount; + private final boolean unloadByIdle; /* * JspServletWrapper for JSP pages. @@ -102,6 +104,8 @@ public class JspServletWrapper { this.options = options; this.jspUri = jspUri; unloadByCount = options.getMaxLoadedJsps() > 0 ? true : false; + unloadByIdle = options.getJspIdleTimeout() > 0 ? true : false; + unloadAllowed = unloadByCount || unloadByIdle ? true : false; ctxt = new JspCompilationContext(jspUri, isErrorPage, options, config.getServletContext(), this, rctxt); @@ -123,6 +127,8 @@ public class JspServletWrapper { this.jspUri = tagFilePath; this.tripCount = 0; unloadByCount = options.getMaxLoadedJsps() > 0 ? true : false; + unloadByIdle = options.getJspIdleTimeout() > 0 ? true : false; + unloadAllowed = unloadByCount || unloadByIdle ? true : false; ctxt = new JspCompilationContext(jspUri, tagInfo, options, servletContext, this, rctxt, tagJarResource); @@ -296,6 +302,10 @@ public class JspServletWrapper { return jspUri; } + public FastRemovalDequeue<JspServletWrapper>.Entry getUnloadHandle() { + return unloadHandle; + } + public void service(HttpServletRequest request, HttpServletResponse response, boolean precompile) @@ -377,13 +387,19 @@ public class JspServletWrapper { /* * (3) Handle limitation of number of loaded Jsps */ - if (unloadByCount) { + if (unloadAllowed) { synchronized(this) { - if (unloadHandle == null) { - unloadHandle = ctxt.getRuntimeContext().push(this); - } else if (lastUsageTime < ctxt.getRuntimeContext().getLastJspQueueUpdate()) { - ctxt.getRuntimeContext().makeYoungest(unloadHandle); - lastUsageTime = System.currentTimeMillis(); + if (unloadByCount) { + if (unloadHandle == null) { + unloadHandle = ctxt.getRuntimeContext().push(this); + } else if (lastUsageTime < ctxt.getRuntimeContext().getLastJspQueueUpdate()) { + ctxt.getRuntimeContext().makeYoungest(unloadHandle); + lastUsageTime = System.currentTimeMillis(); + } + } else { + if (lastUsageTime < ctxt.getRuntimeContext().getLastJspQueueUpdate()) { + lastUsageTime = System.currentTimeMillis(); + } } } } @@ -469,6 +485,13 @@ public class JspServletWrapper { } /** + * @return the lastUsageTime. + */ + public long getLastUsageTime() { + return lastUsageTime; + } + + /** * <p>Attempts to construct a JasperException that contains helpful information * about what went wrong. Uses the JSP compiler system to translate the line * number in the generated servlet that originated the exception to a line --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org