Author: markt
Date: Wed Oct 28 19:25:31 2009
New Revision: 830736

URL: http://svn.apache.org/viewvc?rev=830736&view=rev
Log:
Add a workaround for a common cause of locked files.

Modified:
    
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties

Modified: 
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java?rev=830736&r1=830735&r2=830736&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java 
(original)
+++ 
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java 
Wed Oct 28 19:25:31 2009
@@ -17,21 +17,41 @@
 
 package org.apache.catalina.core;
 
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
 import javax.imageio.ImageIO;
 
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleEvent;
 import org.apache.catalina.LifecycleListener;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
- * Provide a workaround for known places where the Java Runtime environment 
uses
+ * Provide a workaround for known places where the Java Runtime environment can
+ * cause a memory leak or lock files.
+ * <p>
+ * Memory leaks occur when JRE code uses
  * the context class loader to load a singleton as this will cause a memory 
leak
  * if a web application class loader happens to be the context class loader at
  * the time. The work-around is to initialise these singletons when Tomcat's
  * common class loader is the context class loader.
+ * <p>
+ * Locked usually files occur when a resource inside a JAR is accessed without
+ * first disabling Jar URL connection caching. The workaround is to disable 
this
+ * caching by default. 
  */
 public class JreMemoryLeakPreventionListener implements LifecycleListener {
 
+    protected static final Log log =
+        LogFactory.getLog(JreMemoryLeakPreventionListener.class);
+    protected static final StringManager sm =
+        StringManager.getManager(Constants.Package);
+    
     @Override
     public void lifecycleEvent(LifecycleEvent event) {
         // Initialise these classes when Tomcat starts
@@ -42,7 +62,6 @@
              * 
              * Those libraries / components known to trigger memory leaks due 
to
              * eventual calls to getAppContext() are:
-             * 
              * - Google Web Toolkit via its use of javax.imageio
              * - Tomcat via its use of java.beans.Introspector.flushCaches() in
              *   1.6.0_15 onwards
@@ -54,6 +73,31 @@
             // issue.
             ImageIO.getCacheDirectory();
             
+            /*
+             * Several components end up opening JarURLConnections without 
first
+             * disabling chaching. This effectively locks the file. Whilst more
+             * noticeable and harder to ignore on Windows, it affects all
+             * operating systems.
+             * 
+             * Those libraries/components known to trigger this issue include:
+             * - log4j versions 1.2.15 and earlier
+             * - javax.xml.bind.JAXBContext.newInstance()
+             */
+            
+            // Set the default JAR URL caching policy to not to cache
+            try {
+                // Doesn't matter that this JAR doesn't exist - just as long as
+                // the URL is well-formed
+                URL url = new URL("jar:file://dummy.jar!/dummy.txt");
+                URLConnection uConn = url.openConnection();
+                uConn.setDefaultUseCaches(false);
+            } catch (MalformedURLException e) {
+                log.error(sm.getString(
+                        "jreLeakListener.jarUrlConnCacheFail"), e);
+            } catch (IOException e) {
+                log.error(sm.getString(
+                "jreLeakListener.jarUrlConnCacheFail"), e);
+            }
         }
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=830736&r1=830735&r2=830736&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Wed Oct 
28 19:25:31 2009
@@ -65,6 +65,7 @@
 httpHostMapper.container=This container is not a StandardHost
 interceptorValve.alreadyStarted=InterceptorValve has already been started
 interceptorValve.notStarted=InterceptorValve has not yet been started
+jreLeakListener.jarUrlConnCacheFail=Failed to disable Jar URL connection 
caching by default
 naming.wsdlFailed=Failed to find wsdl file: {0}
 naming.bindFailed=Failed to bind object: {0}
 naming.jmxRegistrationFailed=Failed to register in JMX: {0}



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to