Hi,

for some feature of the memcached-session-manager (memcached-based
session failover, [1]) I want to access/reference webapplication classes
(in WEB-INF/lib/) directly from my manager implementation (subclasses
o.a.catalina.session.ManagerBase, registered via Context/Manager) when
tomcat starts. Alternatively, I would like to do this during request
time (in the context of a request). Unfortunately, this doesn't seem to
work (the issue is describe later, below).

The strange thing is that basically the memcached-session-manager (msm)
already needs to have access to classes from the webapp, as it
serialized/deserializes them (in the context of a request). In these
cases I use the manager.getContainer().getLoader().getClassLoader(),
which reports to be a WebappClassLoader.

The exact issue that I have now is that I want to ship msm with custom
serializers for certain types that are used when some class is avaible:
e.g. if the application uses joda DateTime I want to activate a custom
serializer for joda DateTime.

The code that tries to load the serializer for joda DateTime looks like
this:

public class CustomFormatLoader {

    ...

    public static XMLFormat<?>[] loadFormats( final ClassLoader classLoader ) {
        final List<XMLFormat<?>> result = new ArrayList<XMLFormat<?>>();
        try {
            // see if we can load the JodaDateTimeFormat
            final XMLFormat<?> xmlFormat = (XMLFormat<?>) Class.forName( 
"de.javakaffee.web.msm.serializer.javolution.JodaDateTimeFormat",
                true, classLoader ).newInstance();
            result.add( xmlFormat );
            LOG.info( "Loaded JodaDateTimeFormat." );
        } catch ( final Exception e ) {
            LOG.info( "JodaDateTimeFormat not loaded (joda seems to be not 
available)." );
        }
        return result.toArray( new XMLFormat<?>[result.size()] );
    }

}

The JodaDateTimeFormat:

public class JodaDateTimeFormat extends XMLFormat<DateTime> {

    private static final DateTimeFormatter FORMAT = 
ISODateTimeFormat.basicDateTime();

    /**
     * @param cls
     */
    protected JodaDateTimeFormat() {
        super( DateTime.class );
    }
 
    ...

}

When I try to loadFormats in the context of a request, this exception is
thrown:

Jan 10, 2010 2:57:51 PM org.apache.catalina.connector.CoyoteAdapter service     
               
SEVERE: An exception or error occurred in the container during the request 
processing          
java.lang.NoClassDefFoundError: org/joda/time/format/ISODateTimeFormat          
               
        at 
de.javakaffee.web.msm.serializer.javolution.JodaDateTimeFormat.<clinit>(JodaDateTimeFormat.java:35)
        at java.lang.Class.forName0(Native Method)                              
                              
        at java.lang.Class.forName(Class.java:247)                              
                              
        at 
de.javakaffee.web.msm.serializer.javolution.CustomFormatLoader.loadFormats(CustomFormatLoader.java:46)
        at 
de.javakaffee.web.msm.serializer.javolution.ReflectionBinding.getFormat(ReflectionBinding.java:134)
   
        at javolution.xml.XMLFormat$OutputElement.add(XMLFormat.java:815)       
                                 
        at javolution.xml.XMLObjectWriter.write(XMLObjectWriter.java:242)       
                                 
        at 
de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoder.serialize(JavolutionTranscoder.java:108)
        at 
net.spy.memcached.transcoders.SerializingTranscoder.encode(SerializingTranscoder.java:135)
               
        at 
net.spy.memcached.MemcachedClient.asyncStore(MemcachedClient.java:274)          
                         
        at net.spy.memcached.MemcachedClient.set(MemcachedClient.java:631)      
                                    
        at 
de.javakaffee.web.msm.MemcachedBackupSessionManager.storeSessionInMemcached(MemcachedBackupSessionManager.java:721)
                                                                                
                                          
        at 
de.javakaffee.web.msm.MemcachedBackupSessionManager.backupSession(MemcachedBackupSessionManager.java:495)
        
        at 
de.javakaffee.web.msm.SessionTrackerValve.backupSession(SessionTrackerValve.java:117)
                            
        at 
de.javakaffee.web.msm.SessionTrackerValve.invoke(SessionTrackerValve.java:107)  
                                 
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)   
                                 
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)   
                                 
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
                                
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)     
                                 
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)      
                                 
        at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
                 
        at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)         
                                 
        at java.lang.Thread.run(Thread.java:619)                                
                                            
Caused by: java.lang.ClassNotFoundException: 
org.joda.time.format.ISODateTimeFormat                                         
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)               
                                            
        at java.security.AccessController.doPrivileged(Native Method)           
                                            
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)           
                                            
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)                
                                            
        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)                
                                            
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

Though, the ISODateTimeFormat definitively is available in the
classpath, as it's used in the application, and also 
[grot...@mescalin hunter]$ jar tvf webapps/shop/WEB-INF/lib/joda-time-1.6.jar | 
grep ISODateTimeFormat
 14278 Tue Oct 28 00:12:14 CET 2008 org/joda/time/format/ISODateTimeFormat.class
shows this.

Can someone help with this?

Thanx in advance,
cheers,
Martin


[1] http://code.google.com/p/memcached-session-manager/


Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to