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

Java 在Tomcat 6.0上加载持久会话时发生IOException,java,spring,tomcat,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.WriteAbortedExcepti

我们在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)
原因

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对象序列化,这要求所有对象都是可序列化的

我们在Spring中映射了登录bean,如下所示

<bean id="currLogin" class="bean.Login" scope="session">
      <aop:scoped-proxy />
</bean>

补救措施

短期

  • 删除catalina_home/work目录中的session.ser文件
  • 重新启动tomcat服务器
我们能够在跳转服务器后登录到应用程序而不会出现错误

长期

  • 通过实现serializable 接口
  • 没有Tomcat序列化会话(添加 在应用程序或全局tomcat中访问context.xml conf/目录中的context.xml,位于元素内部

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

我相信如果您想让Tomcat在重启之间的会话中持久化对象,您需要实现可序列化的
接口。您基本上已经回答了自己的问题

这取决于您是否希望它们在重启之间持久化