Mantis - Resin
Viewing Issue Advanced Details
306 minor always 07-12-05 00:00 11-30-05 14:43
ferg  
 
urgent  
closed 3.0.14  
3.0.14 fixed  
none    
none 3.0.15  
0000306: JMS deserialization classloader issues
RSN-345
(rep by Gunther Wieser)

we are encountering a problem with resin 3.0.12 and 3.0.14 (we haven't tested any other version).
we use the JMS implementation that comes with resin, and this has been working for the last weeks perfectly.
now we changed the definition of a message, and with these changes we introduced a new property of the bean called "Pharmacy". the class "Pharmacy" again holds several properties, all of course either marked transient or inplementing serializable.

at the point where we encounter the problem, the "Pharmacy" object had already been serialized for several times, so we can be pretty sure that serialization itself works perfectly with this class. the serialization happened in a workflow enige we use, just to make clear that these steps BEFORE the problem have nothing to do with using JMS.

but when we send the message, we get the following error:

java.lang.ClassNotFoundException: de.storm.uniteddesign.model.pharmacy.Address
        at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:219)
        at java.io.ObjectInputStream.resolveProxyClass(ObjectInputStream.java:630)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1469)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1432)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
        at com.caucho.jms.message.ObjectMessageImpl.getObject(ObjectMessageImpl.java:85)
        at com.caucho.jms.jdbc.JdbcMessage.writeObject(JdbcMessage.java:629)
        at com.caucho.jms.jdbc.JdbcMessage.send(JdbcMessage.java:230)
        at com.caucho.jms.jdbc.JdbcQueue.send(JdbcQueue.java:161)
        at com.caucho.jms.session.SessionImpl.send(SessionImpl.java:752)
        at com.caucho.jms.session.MessageProducerImpl.send(MessageProducerImpl.java:161)

Notes
(0000345)
ferg   
07-12-05 00:00   
It looks like the serialized object uses Proxy classes which require a separate overload in ContextLoaderObjectInputStream.