負荷分散されたTomcat 6.0にデプロイされたflexのアプリケーションがあります(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 がすべてのアクティブなセッションの完全なオブジェクト グラフをシリアル化しようとし、起動時にそれらを復元しようとすることです。この重要な点は、Tomcat が「通常の」Java オブジェクトのシリアライゼーションを使用することです。これには、すべてのオブジェクトがシリアライズ可能である必要があります。
Spring のログイン Bean を次のようにマッピングしました。
<bean id="currLogin" class="bean.Login" scope="session">
<aop:scoped-proxy />
</bean>
療法
短期
- catalina_home/work ディレクトリにあるファイル session.ser を削除します。
- Tomcat サーバーを再起動します。
サーバーをバウンスした後、エラーなしでアプリケーションにログインできます。
長期
- Serializable インターフェースを実装して、bean.Login をシリアライズ可能にします。
- Tomcat のシリアル化セッションを持たない (アプリ内または要素内の conf/ ディレクトリ内のグローバルな tomcat context.xml 内の context.xml に追加します。
この問題を解決する方法を教えてください。