最近又碰到关于Stateful Session Bean一个异常:
15:39:30,731 INFO [STDOUT] 29.04.2007 15:39:30 *WARN * [Thread-6] AbstractInsta
nceCache: failed to passivate, id=f136guhj-6 (AbstractInstanceCache.java, line 2
14)
javax.ejb.EJBException: Could not passivate; failed to save state
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:423)
at org.jboss.ejb.plugins.StatefulSessionInstanceCache.passivate(Stateful
SessionInstanceCache.java:107)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:209)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:162)
at org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy$OveragerTask.ru
n(LRUEnterpriseContextCachePolicy.java:450)
at java.util.TimerThread.mainLoop(Timer.java:432)
at java.util.TimerThread.run(Timer.java:382)
Caused by: java.io.NotSerializableException: com.ucap.contents.resource.XAResour
ceClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
:1332)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
04)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
a:1247)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:414)
... 6 more
15:39:30,731 WARN [AbstractInstanceCache] failed to passivate, id=f136guhj-6
javax.ejb.EJBException: Could not passivate; failed to save state
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:423)
at org.jboss.ejb.plugins.StatefulSessionInstanceCache.passivate(Stateful
SessionInstanceCache.java:107)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:209)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:162)
at org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy$OveragerTask.ru
n(LRUEnterpriseContextCachePolicy.java:450)
at java.util.TimerThread.mainLoop(Timer.java:432)
at java.util.TimerThread.run(Timer.java:382)
Caused by: java.io.NotSerializableException: com.ucap.contents.resource.XAResour
ceClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
:1332)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
04)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
a:1247)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:414)
... 6 more
分析及解决:
经过查阅《Enterprise JavaBeans,3rd》p,有如下描述:
When a bean is about to be passivated, its ejbPassivate() method is invoked, alerting the bean instance that it is about to enter the Passivated state. At this time, the bean instance should close any open resources and set all nontransient, nonserializable fields to null. This will prevent problems from occurring when the bean is serialized. Transient fields will simply be ignored.
即对于非transient、非serializable 的属性需要在ejbPassivate() 中设置为null,从而避免序列化时出错。当然,如果在一定时间内,该会话bean再次被调用,容器将激活此会话bean,读取该文件中的状态,重新创建此bean实例,如果需要恢复该变量则需要在ejbActivate()中重新初始化。
参考: http://hi.baidu.com/nine/blog/item/4ec9d539538d32f33a87cecc.html
15:39:30,731 INFO [STDOUT] 29.04.2007 15:39:30 *WARN * [Thread-6] AbstractInsta
nceCache: failed to passivate, id=f136guhj-6 (AbstractInstanceCache.java, line 2
14)
javax.ejb.EJBException: Could not passivate; failed to save state
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:423)
at org.jboss.ejb.plugins.StatefulSessionInstanceCache.passivate(Stateful
SessionInstanceCache.java:107)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:209)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:162)
at org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy$OveragerTask.ru
n(LRUEnterpriseContextCachePolicy.java:450)
at java.util.TimerThread.mainLoop(Timer.java:432)
at java.util.TimerThread.run(Timer.java:382)
Caused by: java.io.NotSerializableException: com.ucap.contents.resource.XAResour
ceClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
:1332)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
04)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
a:1247)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:414)
... 6 more
15:39:30,731 WARN [AbstractInstanceCache] failed to passivate, id=f136guhj-6
javax.ejb.EJBException: Could not passivate; failed to save state
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:423)
at org.jboss.ejb.plugins.StatefulSessionInstanceCache.passivate(Stateful
SessionInstanceCache.java:107)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:209)
at org.jboss.ejb.plugins.AbstractInstanceCache.tryToPassivate(AbstractIn
stanceCache.java:162)
at org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy$OveragerTask.ru
n(LRUEnterpriseContextCachePolicy.java:450)
at java.util.TimerThread.mainLoop(Timer.java:432)
at java.util.TimerThread.run(Timer.java:382)
Caused by: java.io.NotSerializableException: com.ucap.contents.resource.XAResour
ceClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
:1332)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
04)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
a:1247)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
at org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager.passivate
Session(StatefulSessionFilePersistenceManager.java:414)
... 6 more
分析及解决:
经过查阅《Enterprise JavaBeans,3rd》p,有如下描述:
When a bean is about to be passivated, its ejbPassivate() method is invoked, alerting the bean instance that it is about to enter the Passivated state. At this time, the bean instance should close any open resources and set all nontransient, nonserializable fields to null. This will prevent problems from occurring when the bean is serialized. Transient fields will simply be ignored.
即对于非transient、非serializable 的属性需要在ejbPassivate() 中设置为null,从而避免序列化时出错。当然,如果在一定时间内,该会话bean再次被调用,容器将激活此会话bean,读取该文件中的状态,重新创建此bean实例,如果需要恢复该变量则需要在ejbActivate()中重新初始化。
参考: http://hi.baidu.com/nine/blog/item/4ec9d539538d32f33a87cecc.html