セションのリカバリ処理
Servletコンテナは、クライアントから通知されてきたセションIDに該当するセションを保持していない場合(もともとそのセションを扱っていたServletコンテナがダウンした場合など)、他のコンテナによりバックアップされているセションをSession Registry Serverから取得し、リクエストを処理します。
Session Registry Serverは、Servletコンテナからセションの取得要求があった場合、単にバックアップされたセションを返すのではなく、以下の図のように可能な限り最新のセションを返して、もとのServletコンテナのセションを破棄します。
WebサーバコネクタはServletコンテナAにリクエストを送ろうとしましたが、ServletコンテナAに障害が発生し、リクエストの送信に失敗しました。
WebサーバコネクタはServletコンテナBにリクエストを振り分けます。
ServletコンテナBは送られてきたセションは自分が所有するセションではないため、Session Registry Serverにバックアップされたセションの取得要求を行います。
Session Registry Serverはセションの元々の所有者であるServletコンテナAに最新のセションを要求します。
ServletコンテナAはセションをSession Registry Serverに受け渡します。
ServletコンテナA上のセションは受け渡しにより破棄されます。
この時、HttpSessionListener.sessionDestroyed、HttpSessionBindingListener.valueUnBoundは呼び出されません。
Session Registry Serverはこの受け取った最新のセションをServletコンテナBにリカバリします。
ServletコンテナAとの通信に異常がある場合など、最新のセションを取得できないときは、Session Registry ServerはすでにバックアップされているセションをServletコンテナBにリカバリします。
また(4)において、該当の(セションの元々の所有者である)Servletコンテナとの通信ができない場合や、ひとつのServletコンテナに対する最新セションの要求処理が高多重となった場合、Session Registry Serverはそれ以上の最新セションの要求を行わずにSession Registry Serverにバックアップされているセションを返します。そのため、必ずしも最新のセションを取得(リカバリ)できるとは限りませんが、指定した契機でバックアップ済みのセションのリカバリは保証されます。
なお、(5)においてServletコンテナAでセションを使用中であった場合、使用終了するまでセションはバックアップされません。どれくらいの時間使用する可能性があるかはアプリケーション処理に依存するため、この最大待ち時間を指定することが可能です。
待ち時間を経過してもセションを使用中である場合、セションはServletコンテナBにリカバリされません。
このとき、getSession()、getSession(true)の場合は新規セション、getSession(false)の場合はnullがアプリケーションに返却されます。
HttpSessionActivationListener
セションに結びつけられているオブジェクトは、セションの非活性化や活性化といったコンテナのイベントからの通知を受けることができます。VM間でセションを移動させたりセションを持続させたりするコンテナは、セションに結びつけられている属性のうちHttpSessionActivationListener を実装しているすべての属性に通知することを要求されます。
イベント | メソッド | |
---|---|---|
sessionWillPassivate | sessionDidActivate | |
リカバリ時 | 元のServletコンテナで実行 | リカバリ先のServletコンテナで実行 |
Servletコンテナ停止時 | セションをバックアップする前に実行 | - |
Servletコンテナ起動時 | - | セションがリカバリされた後に実行 |
セションをリカバリできない場合
セションリカバリ機能を使用していても、以下の場合、セションがSession Registry Serverに存在しないため、セションのリカバリはできません。
[Session Registry Serverで保持するセションの上限数]を超えてバックアップが行われ、バックアップから破棄された(古い)セションについてのリカバリが発生した場合。
セションのバックアップの契機を[一定間隔]としている場合に、バックアップされる前にServletコンテナがダウンしたとき。
IJServerおよびセションの永続化機能を無効としている場合に、Session Registry Serverを再起動したとき。
セションの永続化機能を有効としている場合でも、指定した間隔で永続化が行われる前にSession Registry Serverがダウンし、かつServletコンテナを再起動したとき。
リカバリが保証される範囲については、“9.2 セションリカバリ機能の補償範囲”も参照してください。