在Tomcat 6.0上加载持久会话时发生IOException

时间:2013-01-22 08:30:11

标签: java spring tomcat

我们在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序列化会话(添加 到application.xml,在app或全局tomcat中 conf /目录中的context.xml,在元素内。

请告诉我们解决此问题的方法?

1 个答案:

答案 0 :(得分:5)

我相信如果您希望Tomcat在重新启动之间持久保存Session中的对象,则需要实现Serializable接口。你差不多回答了自己的问题。

您是否希望它们在重新启动之间保持不变。