4

負荷分散された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 に追加します。

この問題を解決する方法を教えてください。

4

1 に答える 1

5

Tomcat が再起動間でセッション内のオブジェクトを保持するようにしたい場合は、Serializableインターフェイスを実装する必要があると思います。あなた自身の質問にほとんど答えました。

再起動後も保持するかどうかは、あなた次第です。

于 2013-01-22T08:52:19.773 に答える