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: [email protected]
For additional commands, e-mail: [email protected]