我们在 flex 中有一个应用程序,它部署在负载平衡的 Tomcat 6.0 上(有一个负载平衡器将请求传递给 2 个 tomcat 服务器)。
访问应用程序时出现 404 错误。在挖掘 tomat 日志时,我们发现了以下错误
日志跟踪
2013-01-17 10:42:54,148 org.apache.catalina.session.ManagerBase - IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: bean.Login
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: bean.Login
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
..
2013-01-17 10:43:04,135 org.apache.catalina.session.ManagerBase - Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: bean.Login
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
…
Caused by: java.io.NotSerializableException: bean.Login
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
原因
此错误的可能原因是 Tomcat 在您关闭时尝试序列化所有活动会话的完整对象图,然后在您重新启动时尝试恢复它们。关键是Tomcat使用“普通”的java对象序列化,它要求所有对象都是Serializable。
我们在 Spring 中映射了 Login bean,如下所示
<bean id="currLogin" class="bean.Login" scope="session">
<aop:scoped-proxy />
</bean>
补救
短期
- 删除 catalina_home/work 目录下的 session.ser 文件
- 重启tomcat服务器
弹回服务器后,我们能够登录到应用程序而不会出现错误。
长期
- 通过实现 Serializable 接口使 bean.Login 可序列化。
- 没有 Tomcat 序列化会话(添加到 context.xml,在应用程序中或在 conf/ 目录中的全局 tomcat context.xml 中,在元素内。
请让我们知道解决此问题的方法?