[ http://issues.apache.org/jira/browse/JCR-120?page=all ] Jukka Zitting closed JCR-120: -----------------------------
> Jackrabbit fails to shutdown properly when tomcat is shutting down > ------------------------------------------------------------------ > > Key: JCR-120 > URL: http://issues.apache.org/jira/browse/JCR-120 > Project: Jackrabbit > Type: Bug > Components: observation, core > Reporter: fabrizio giustina > Assignee: Jukka Zitting > Fix For: 1.0 > Attachments: JCR-120.diff, shutdown1.png, shutdown2.png > > This is the same issue already discudded in > http://issues.apache.org/jira/browse/JCR-57 > The problem only occurs when Jackrabbit is deployed in the WEB-INF/lib > directory of a web application in Tomcat. > During dispose() jackrabbit tries to instantiate a few objects from classes > which were not previously loaded by the webapp classloader, but tomcat > doesn't allow to load new classes while shutting down. > This causes the repository not to be closed properly, and an annoying set of > stack traces are written to the log. > It seems that there are only two classes which are loaded in this situation: > org.apache.jackrabbit.core.observation.EventListenerIteratorImpl and > org.apache.jackrabbit.core.fs.FileSystemPathUtil. This is the log from the > server standard output: > org.apache.catalina.loader.WebappClassLoader loadClass > INFO: Illegal access: this web application instance has been stopped already. > Could not load > org.apache.jackrabbit.core.observation.EventListenerIteratorImpl. The > eventual following stack trace is caused by an error thrown for debugging > purposes as well as to attempt to terminate the thread which caused the > illegal access, and has no functional impact. > [repeaded more times at each shutdown] > org.apache.catalina.loader.WebappClassLoader loadClass > INFO: Illegal access: this web application instance has been stopped already. > Could not load org.apache.jackrabbit.core.fs.FileSystemPathUtil. The > eventual following stack trace is caused by an error thrown for debugging > purposes as well as to attempt to terminate the thread which caused the > illegal access, and has no functional impact. > A quick fix is to force preloading of classes normally needed only during > shutdown, simply adding a static block to caller classes. The following patch > makes tomcat happy, causing classes to be loaded by the webapp classloaded > when still allowed (probably not really elegant, but perfectly working...) > Index: org/apache/jackrabbit/core/fs/FileSystemResource.java > =================================================================== > --- src\java\org\apache\jackrabbit\core\fs\FileSystemResource.java > (revision 169503) > +++ src\java\org\apache\jackrabbit\core\fs\FileSystemResource.java > (working copy) > @@ -30,6 +30,11 @@ > > protected final String path; > > + static { > + // preload FileSystemPathUtil to prevent classloader issues during > shutdown > + FileSystemPathUtil.class.hashCode(); > + } > + > /** > * Creates a new <code>FileSystemResource</code> > * > Index: org/apache/jackrabbit/core/observation/ObservationManagerImpl.java > =================================================================== > --- > src\java\org\apache\jackrabbit\core\observation\ObservationManagerImpl.java > (revision 169503) > +++ > src\java\org\apache\jackrabbit\core\observation\ObservationManagerImpl.java > (working copy) > @@ -54,6 +54,11 @@ > */ > private final ObservationManagerFactory obsMgrFactory; > > + static { > + // preload EventListenerIteratorImpl to prevent classloader issues > during shutdown > + EventListenerIteratorImpl.class.hashCode(); > + } > + > /** > * Creates an <code>ObservationManager</code> instance. > * -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira