ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド

9.1.2 セションのリカバリ

セションリカバリ処理

Servletコンテナは、クライアントから通知されてきたセションIDに該当するセションを保持していない場合(もともとそのセションを扱っていたServletコンテナがダウンした場合など)、他のコンテナによりバックアップされているセションをSession Registry Serverから取得し、リクエストを処理します。
Session Registry Serverは、Servletコンテナからセションの取得要求があった場合、単にバックアップされたセションを返すのではなく、以下の図のように可能な限り最新のセションを返して、もとのServletコンテナのセションを破棄します。



  1. WebサーバコネクタはServletコンテナAにリクエストを送ろうとしましたが、ServletコンテナAに障害が発生し、リクエストの送信に失敗しました。

  2. WebサーバコネクタはServletコンテナBにリクエストを振り分けます。

  3. ServletコンテナBは送られてきたセションは自分が所有するセションではないため、Session Registry Serverにバックアップされたセションの取得要求を行います。

  4. Session Registry Serverはセションの元々の所有者であるServletコンテナAに最新のセションを要求します。

  5. ServletコンテナAはセションをSession Registry Serverに受け渡します。
    ServletコンテナA上のセションは受け渡しにより破棄されます。
    この時、HttpSessionListener.sessionDestroyed、HttpSessionBindingListener.valueUnBoundは呼び出されません。

  6. 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に存在しないため、セションのリカバリはできません。

リカバリが保証される範囲については、“9.2 セションリカバリ機能の補償範囲”も参照してください。