Sunday, July 19, 2009

Spring, Transactions and Serialization

Have investigated interesting Spring serialization issue in clustered environment. NotSerializableException was thrown during session externalization.

Here is the reason.

Spring, Transactions and Serialization

One Spring session bean has reference to another Spring bean for which declarative transaction management is applied. In fact this reference is reference to Spring AOP proxy which drives transactions. As described in Spring issue SPR-4662 this proxy cannot be serialized when HibernateTransactionManager is used.

This issue was fixed in Spring 3.0 RC1.
In earlier versions the simplest solutions is to eliminate serialization of Spring transactional beans. To solve this problem we just replaced the Spring session bean with alternative implementation.

Original exception thrown:

ERROR [org.jboss.web.tomcat.tc5.session.JBossCacheService] externalizeSession(): exception occurred externalizing session SessionBasedClusteredSession[...]
java.io.NotSerializableException: org.springframework.beans.factory.support.DefaultListableBeanFactory
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1347)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
at org.springframework.transaction.interceptor.TransactionInterceptor.writeObject(TransactionInterceptor.java:186)
...
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
at java.util.Hashtable.writeObject(Hashtable.java:813)
...
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
at org.jboss.web.tomcat.tc5.session.SessionBasedClusteredSession.writeExternal(SessionBasedClusteredSession.java:175)
at org.jboss.web.tomcat.tc5.session.JBossCacheService.externalizeSession(JBossCacheService.java:1023)
at org.jboss.web.tomcat.tc5.session.JBossCacheService.putSession(JBossCacheService.java:312)
at org.jboss.web.tomcat.tc5.session.JBossCacheClusteredSession.processSessionRepl(JBossCacheClusteredSession.java:121)
at org.jboss.web.tomcat.tc5.session.JBossCacheManager.processSessionRepl(JBossCacheManager.java:1093)
at org.jboss.web.tomcat.tc5.session.JBossCacheManager.storeSession(JBossCacheManager.java:648)
...

0 comments:

Post a Comment