5.3.3 グローバルセッション情報として引き継げるHTTPセッションの属性
ここでは,障害発生時に引き継げるHTTPセッションの属性に関する次の項目について説明します。
-
引き継げるHTTPセッションの属性の条件
-
引き継ぎ対象としてサポートされるオブジェクト
-
オブジェクトの内容によるセッション情報の引き継ぎ可否
-
HTTPセッションの属性引き継ぎ時のシリアライズ処理についての注意事項
-
HTTPセッションの属性引き継ぎ時のデシリアライズ処理についての注意事項
-
HTTPセッションの属性引き継ぎ時の注意事項
- 〈この項の構成〉
(1) 引き継げるHTTPセッションの属性の条件
セッションフェイルオーバ機能では,グローバルセッション情報の更新処理でオブジェクトのシリアライズ,引き継ぎ処理でオブジェクトのデシリアライズ処理が発生します。そのため,HTTPセッションに登録する属性は,次の条件を満たす必要があります。
-
java.io.Serializableインタフェースを実装した直列化可能クラスのオブジェクトである。
(2) 引き継ぎ対象としてサポートされるオブジェクト
セッションフェイルオーバ機能では,次に示す直列化可能クラスのオブジェクトを引き継ぎ対象としてサポートしています。
-
J2EEアプリケーションで提供されるクラスのオブジェクト。
-
J2SEで提供されるクラスのオブジェクト。
ただし,引き継ぎ処理では,HTTPセッションに登録された直列化可能クラスのオブジェクトが,セッションフェイルオーバ機能でサポートされているオブジェクトかどうかはチェックされません。
(3) オブジェクトの内容によるセッション情報の引き継ぎ可否
HTTPセッションに登録されたオブジェクトの内容によるセッション情報の引き継ぎ可否を次の表に示します。
(4) HTTPセッションの属性引き継ぎ時のシリアライズ処理についての注意事項
シリアライズ処理についての注意事項を次に示します。
(a) シリアライズ処理が性能に与える影響
引き継ぎ対象のオブジェクトだけでなく,引き継ぎ対象のオブジェクトから参照されるオブジェクトすべてを対象としてシリアライズ処理が実行されます。このため,引き継ぐ必要がない情報を含むクラスなどをHTTPセッションに登録した場合,性能が低下するおそれがあります。
(b) java.lang.OutOfMemoryErrorエラーが発生する場合
シリアライズ処理では,一時的に,アプリケーションで設定したHttpSessionオブジェクト数を超えてシリアライズ後のデータが作成されます。そのため,巨大なオブジェクトがHTTPセッションに登録された場合,グローバルセッション情報の作成中にjava.lang.OutOfMemoryErrorエラーが発生することがあります。
(c) シリアライズに失敗する場合とその対処
次のような場合は,KDJE34317-W,KDJE34318-E,KDJE34410-W,またはKDJE34411-Eのメッセージが出力され,シリアライズに失敗します。
-
HTTPセッションに登録したオブジェクト(直列化可能クラスのオブジェクト)から参照するオブジェクトに,直列化可能クラス以外のクラスを実装したオブジェクトが含まれる場合。
-
オブジェクトにwriteObject(java.io.OutputStream out)メソッドが実装されており,シリアライズ時に例外が発生する場合。
失敗した場合,グローバルセッション情報の更新,および引き継ぎ処理が実行されません。処理を実行するためには,次のどちらかの対処が必要です。
-
シリアライズに失敗したオブジェクトのHTTPセッションへの登録を解除する。
-
シリアライズに失敗したオブジェクトを変更して,シリアライズに失敗した原因を取り除く。
(5) HTTPセッションの属性引き継ぎ時のデシリアライズ処理についての注意事項
次のような場合は,デシリアライズに失敗します。
-
デシリアライズに失敗する原因となる変更がWebアプリケーションに加えられ,シリアライズ時とWebアプリケーションが異なっている場合。
-
オブジェクトにreadObject(java.io.OutputStream out)メソッドが実装されており,デシリアライズ時に例外が発生する場合。
リクエストの受信時,またはWebアプリケーション開始時のグローバルセッション情報の引き継ぎ処理でセッション情報のデシリアライズに失敗した場合,グローバルセッション情報およびセッション情報が削除され,KDJE34326-E,またはKDJE34413-Eが出力されます。セッションの引き継ぎに失敗するため,HTTPセッションがない状態でリクエストが処理されます。
(6) HTTPセッションの属性引き継ぎ時の注意事項
完全性保障モードを使わない,かつ同じセッションに対して同時にリクエストが実行される構成である場合,セッションにはスレッドアンセーフなオブジェクトを格納してはなりません(ユーザプログラム内でsynchronized句などを利用したスレッドセーフな実装をしていても,Cosminexus側の処理との競合は防げません)。