Author: rjung
Date: Tue Nov 2 12:14:43 2010
New Revision: 1030014
URL: http://svn.apache.org/viewvc?rev=1030014&view=rev
Log:
Add logging and JMX support to JSP unloading.
Also need to make getContent() public in
FastRemovalDequeue to support logging.
Modified:
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/JspServlet.java
tomcat/trunk/java/org/apache/jasper/servlet/mbeans-descriptors.xml
tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java
tomcat/trunk/webapps/docs/changelog.xml
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=1030014&r1=1030013&r2=1030014&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java
(original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/JspRuntimeContext.java Tue Nov
2 12:14:43 2010
@@ -69,6 +69,11 @@ public final class JspRuntimeContext {
*/
private AtomicInteger jspReloadCount = new AtomicInteger(0);
+ /*
+ * Counts how many times JSPs have been unloaded in this webapp.
+ */
+ private AtomicInteger jspUnloadCount = new AtomicInteger(0);
+
/**
* Preload classes required at runtime by a JSP servlet so that
* we don't get a defineClassInPackage security exception.
@@ -158,6 +163,10 @@ public final class JspRuntimeContext {
if (options.getMaxLoadedJsps() > 0) {
jspQueue = new
FastRemovalDequeue<JspServletWrapper>(options.getMaxLoadedJsps());
+ if (log.isDebugEnabled()) {
+ log.debug(Localizer.getMessage("jsp.message.jsp_queue_created",
+ "" +
options.getMaxLoadedJsps(), context.getContextPath()));
+ }
}
/* Init parameter is in seconds, locally we use milliseconds */
@@ -229,9 +238,17 @@ public final class JspRuntimeContext {
* @return an unloadHandle that can be pushed to front of queue at later
execution times.
* */
public FastRemovalDequeue<JspServletWrapper>.Entry push(JspServletWrapper
jsw) {
+ if (log.isTraceEnabled()) {
+ log.trace(Localizer.getMessage("jsp.message.jsp_added",
+ jsw.getJspUri(),
context.getContextPath()));
+ }
FastRemovalDequeue<JspServletWrapper>.Entry entry = jspQueue.push(jsw);
JspServletWrapper replaced = entry.getReplaced();
if (replaced != null) {
+ if (log.isDebugEnabled()) {
+
log.debug(Localizer.getMessage("jsp.message.jsp_removed_excess",
+ jsw.getJspUri(),
context.getContextPath()));
+ }
unloadJspServletWrapper(replaced);
}
return entry;
@@ -243,6 +260,11 @@ public final class JspRuntimeContext {
* @param unloadHandle the unloadHandle for the jsp.
* */
public void makeYoungest(FastRemovalDequeue<JspServletWrapper>.Entry
unloadHandle) {
+ if (log.isTraceEnabled()) {
+ JspServletWrapper jsw = unloadHandle.getContent();
+ log.trace(Localizer.getMessage("jsp.message.jsp_queue_update",
+ jsw.getJspUri(),
context.getContextPath()));
+ }
jspQueue.moveFirst(unloadHandle);
}
@@ -320,6 +342,36 @@ public final class JspRuntimeContext {
return jspReloadCount.intValue();
}
+ /**
+ * Gets the number of JSPs that are in the JSP limiter queue
+ *
+ * @return The number of JSPs (in the webapp with which this JspServlet is
+ * associated) that are in the JSP limiter queue
+ */
+ public int getJspQueueLength() {
+ if (jspQueue != null) {
+ return jspQueue.getSize();
+ }
+ return -1;
+ }
+
+ /**
+ * Increments the JSP unload counter.
+ */
+ public void incrementJspUnloadCount() {
+ jspUnloadCount.incrementAndGet();
+ }
+
+ /**
+ * Gets the number of JSPs that have been unloaded.
+ *
+ * @return The number of JSPs (in the webapp with which this JspServlet is
+ * associated) that have been unloaded
+ */
+ public int getJspUnloadCount() {
+ return jspUnloadCount.intValue();
+ }
+
/**
* Method used by background thread to check the JSP dependencies
@@ -523,6 +575,7 @@ public final class JspRuntimeContext {
synchronized(jsw) {
jsw.destroy();
}
+ jspUnloadCount.incrementAndGet();
}
@@ -531,6 +584,14 @@ public final class JspRuntimeContext {
*/
public void checkUnload() {
+ if (log.isTraceEnabled()) {
+ int queueLength = -1;
+ if (jspQueue != null) {
+ queueLength = jspQueue.getSize();
+ }
+ log.trace(Localizer.getMessage("jsp.message.jsp_unload_check",
+ context.getContextPath(), "" +
jsps.size(), "" + queueLength));
+ }
long now = System.currentTimeMillis();
if (jspIdleTimeout > 0) {
long unloadBefore = now - jspIdleTimeout;
@@ -539,6 +600,11 @@ public final class JspRuntimeContext {
JspServletWrapper jsw = (JspServletWrapper)wrappers[i];
synchronized(jsw) {
if (jsw.getLastUsageTime() < unloadBefore) {
+ if (log.isDebugEnabled()) {
+
log.debug(Localizer.getMessage("jsp.message.jsp_removed_idle",
+ jsw.getJspUri(),
context.getContextPath(),
+ "" +
(now-jsw.getLastUsageTime())));
+ }
if (jspQueue != null) {
jspQueue.remove(jsw.getUnloadHandle());
}
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=1030014&r1=1030013&r2=1030014&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/jasper/resources/LocalStrings.properties Tue
Nov 2 12:14:43 2010
@@ -472,3 +472,11 @@ jsp.error.bug48498=Unable to display JSP
# UniqueAttributesImpl
jsp.error.duplicateqname=An attribute with duplicate qualified name [{0}] was
found. Attribute qualified names must be unique within an element.
+
+# JSP unloading handling
+jsp.message.jsp_queue_created=Created jsp queue with length {0} for context
[{1}]
+jsp.message.jsp_added=Adding JSP for path [{0}] to queue of context [{1}]
+jsp.message.jsp_queue_update=Updating JSP for path [{0}] in queue of context
[{1}]
+jsp.message.jsp_removed_excess=Removing excess JSP for path [{0}] from queue
of context [{1}]
+jsp.message.jsp_removed_idle=Removing idle JSP for path [{0}] in context [{1}]
after {2} seconds");
+jsp.message.jsp_unload_check=Checking JSPs for unload in context [{0}], JSP
count: {1} queue length: {2}
Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java?rev=1030014&r1=1030013&r2=1030014&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java (original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java Tue Nov 2
12:14:43 2010
@@ -192,6 +192,32 @@ public class JspServlet extends HttpServ
/**
+ * Gets the number of JSPs that are in the JSP limiter queue
+ *
+ * <p>This info may be used for monitoring purposes.
+ *
+ * @return The number of JSPs (in the webapp with which this JspServlet is
+ * associated) that are in the JSP limiter queue
+ */
+ public int getJspQueueLength() {
+ return this.rctxt.getJspQueueLength();
+ }
+
+
+ /**
+ * Gets the number of JSPs that have been unloaded.
+ *
+ * <p>This info may be used for monitoring purposes.
+ *
+ * @return The number of JSPs (in the webapp with which this JspServlet is
+ * associated) that have been unloaded
+ */
+ public int getJspUnloadCount() {
+ return this.rctxt.getJspUnloadCount();
+ }
+
+
+ /**
* <p>Look for a <em>precompilation request</em> as described in
* Section 8.4.2 of the JSP 1.2 Specification. <strong>WARNING</strong> -
* we cannot use <code>request.getParameter()</code> for this, because
Modified: tomcat/trunk/java/org/apache/jasper/servlet/mbeans-descriptors.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/mbeans-descriptors.xml?rev=1030014&r1=1030013&r2=1030014&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/mbeans-descriptors.xml
(original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/mbeans-descriptors.xml Tue Nov
2 12:14:43 2010
@@ -31,6 +31,14 @@
description="The number of JSPs that have been reloaded"
type="int"/>
+ <attribute name="jspUnloadCount"
+ description="The number of JSPs that have been unloaded"
+ type="int"/>
+
+ <attribute name="jspQueueLength"
+ description="The length of the JSP queue (if enabled via
maxLoadedJsps)"
+ type="int"/>
+
</mbean>
-</mbeans-descriptors>
\ No newline at end of file
+</mbeans-descriptors>
Modified: tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java?rev=1030014&r1=1030013&r2=1030014&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java (original)
+++ tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java Tue Nov 2
12:14:43 2010
@@ -272,7 +272,7 @@ public class FastRemovalDequeue<T> {
this.valid = valid;
}
- private final T getContent() {
+ public final T getContent() {
return content;
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1030014&r1=1030013&r2=1030014&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Nov 2 12:14:43 2010
@@ -117,6 +117,9 @@
Add support for unloading JSPs that have not been requested for a
long time using the new parameter <code>jspIdleTimeout</code>. (rjung)
</add>
+ <add>
+ Add logging and JMX support to JSP unloading. (rjung)
+ </add>
</changelog>
</subsection>
<subsection name="Cluster">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]