2011-11-19 7 views
7

ステートフルセッションBeanがパッシベーションを行う場合、その状態がハードディスクに書き込まれ、Beanインスタンスが解放されて他の要求を処理します(少なくともこれは私の理解です)。同じクライアントが再びアクティブになると、Beanインスタンスはハードディスクから状態を読み込み、状態を取り戻します。しかし、Beanインスタンスは、どのクライアントが状態を維持するためにそれを読み込む必要があるかを知っていますか?ステートフルセッションBeanは、クライアントが戻ったときに状態を回復しますか?

私は、J2EEに非常に新しいですので、私は非常に素朴な疑問を求めていた場合、私はご容赦ください。これを理解するために他の話題を知る必要がある場合は、私に正しい方向を教えてください。

答えて

13

これは、通常のJavaクラスのインスタンスに非常に近いとステートフルセッションBean(SFSB)を視覚化するのが最善です。 SfSBのインスタンスを参照(またはインジェクション)すると、コンテナによってインスタンスが作成され、インスタンスが返されます。その後、他のJavaインスタンスと同じように、そのインスタンスで作業します。あなたはそれをディスクにシリアライズ、セッションにインスタンスを保存することができることを意味し

など

詳細は、作業しているインスタンスが実際実際、基礎となるSFSBインスタンスへのプロキシであるということです。それは実際のSfSB自体ではありません。

あなたは、Beanへのあなたのローカルプロキシの呼び出しを行い、あなたのためにメモリにそのBeanを明示するために、容器の仕事です。 Beanのパッシベーションとアクティブ化は、あなたのために舞台裏で行われます(ただし、Beanのライフサイクルを通してプロセスに入ることができます)。

コンテナが不動態化されたSFSBを見つける必要があることをすべての情報は、あなたが作業しているプロキシに保存されているが、これはあなたに不透明です。あなたはそれについて心配する必要はありません。

ので、一般的なWebベースのシナリオでは、ライフサイクルは、あなたが、あなたのBeanインスタンスを取得するWebセッションに保存し、その後、単に通常のようにそれを使用することになります。コンテナがあなたのBeanをパッシベーションして部屋などを作る必要があると判断した場合、自動的にパッシベーションします。ユーザーが戻ると、アプリケーションはWebセッションからインスタンスを取得し、呼び出しを行います。この時点で、Beanがパッシベーションされている場合、コンテナは自動的にBeanをアクティブにします。この全体の仕組みはコンテナに依存していますが、あなたにとっては透過的です。あなたが思い出すことの重要なことは、Javaオブジェクトのように、コンテナから取得するSfSBに掛かる必要があることです。

最終の注意点は、あなたがSFSBが長すぎるために不動態化することができるようにする場合は、コンテナが自動的にあなたのためにそれを削除することです。

+0

ありがとうございます。しかし、SfSBが削除された後にユーザーが戻る可能性はありますか?可能であれば、そのシナリオではどうなりますか? – Bhushan

+2

そうです、それは絶対に可能です。それが起こった場合、SfSBにアクセスしようとすると例外が発生します(正確な例外は、私は言うことができませんでした)。 SfSBのタイムアウトは、(EJB 3.1の注釈を使用するか、またはEJB 3のコンテナ固有のメカニズムを介して)構成可能です。したがって、タイムアウト期間を状態の予想寿命に結びつけることが目標です。それは、私は彼らに無制限に与えないと言った。また、SfSBはアプリケーションの再配備にも耐えることはできません。サーバーの再起動、はい、再デプロイメントは行いません。 –