2014-05-19 23:38 GMT+04:00 <[email protected]>:
> Author: markt
> Date: Mon May 19 19:38:13 2014
> New Revision: 1596004
>
> URL: http://svn.apache.org/r1596004
> Log:
> Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56387
> Refactor handling of class loading attempts after web application stop.
>
> Modified:
> tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
> tomcat/trunk/webapps/docs/changelog.xml
>
> Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
> URL:
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=1596004&r1=1596003&r2=1596004&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
> (original)
> +++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Mon
> May 19 19:38:13 2014
> @@ -852,10 +852,7 @@ public class WebappClassLoader extends U
> if (log.isDebugEnabled())
> log.debug(" findClass(" + name + ")");
>
> - // Cannot load anything from local repositories if class loader is
> stopped
> - if (!state.isAvailable()) {
> - throw new ClassNotFoundException(name);
> - }
> + checkStateForClassLoading(name);
The old code threw a CNFE here. The new code throws nothing.
> // (1) Permission to define this class when using a SecurityManager
> if (securityManager != null) {
> @@ -1215,14 +1212,8 @@ public class WebappClassLoader extends U
> log.debug("loadClass(" + name + ", " + resolve + ")");
> Class<?> clazz = null;
>
> - // Log access to stopped classloader
> - if (!state.isAvailable()) {
> - try {
> - throw new IllegalStateException();
> - } catch (IllegalStateException e) {
> - log.info(sm.getString("webappClassLoader.stopped", name), e);
> - }
> - }
> + // Log access to stopped class loader
> + checkStateForClassLoading(name);
>
> // (0) Check our previously loaded local class cache
> clazz = findLoadedClass0(name);
> @@ -1331,7 +1322,19 @@ public class WebappClassLoader extends U
> }
>
> throw new ClassNotFoundException(name);
> + }
> +
>
> + protected void checkStateForClassLoading(String className) {
> + // It is not permitted to load new classes once the web application
> has
> + // been stopped.
> + if (!state.isAvailable()) {
> + String msg = sm.getString("webappClassLoader.stopped",
> className);
> + IllegalStateException cause = new IllegalStateException(msg);
> + ClassNotFoundException cnfe = new ClassNotFoundException();
It might be better to use "new ClassNotFoundException(className)".
Though from the second look I see that the log message already
mentions the class name.
> + cnfe.initCause(cause);
> + log.info(msg, cnfe);
This method does not throw anything... Thus it is not really a
"ClassNotFoundException", because a class is not really "not found",
but execution continues further and it may occasionally find the
class.
> + }
> }
>
As a test case it looks that
org.apache.catalina.valves.TestStuckThreadDetectionValve
occasionally causes this exception, as was noted by Buildbot
(though that buildbot run was before this change, so it is not illustrative).
http://ci.apache.org/projects/tomcat/tomcat8/1595898/
Best regards,
Konstantin Kolinko
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]