• 検索結果がありません。

Session Beanは、単一クライアントで実行されるオブジェクトです。コンテナは、クライア

ントからのリモート・タスク・リクエストを受けて、Session Beanインスタンスを作成しま

す。Session Beanは、1つのクライアントに対応しています。つまり、Session BeanはEJB

サーバーにおける各クライアントを表していると言えます。また、Session Beanではトラン ザクションが認識されます。すなわち、基礎となるデータベース内の共有データを更新でき ますが、共有データベースのデータ自体を表すことはありません。Session Beanは一時オブ ジェクトであり、その存続期間は比較的短いものです。通常、Session Beanは、クライアン トがセッションの対話を維持している間存続します。クライアントが対話を終了すると、そ のクライアントとSession Beanとの結び付きは失われます。Session Beanは一時オブジェク トとして位置付けられています。コンテナで障害が起きると、Session Beanインスタンスは 削除され、クライアントで処理を続行するためには新しいセッション・オブジェクトを再度 確立する必要があるためです。

Session Beanには、ステートフルSession Bean(SFSB)とステートレスSession Bean

(SLSB)の2種類があります。これらのBeanでは、いずれもjavax.ejb.SessionBean を実装する必要あります。ただし、EJBコンテナ内でのライフ・サイクルは異なります。

ステートフル ステートフル ステートフル

ステートフル Session Bean

Session Beanでは、通常、クライアントとのやり取りまたは対話の状態が維持されます。つ

まり、メソッド起動でのクライアント情報が、クライアント・セッションの存続期間中は保 持されます。このように状態を維持するSession Beanを、ステートフルSession Beanと呼 びます。クライアントとSession Beanとの対話が終了すると、そのセッションは終了し、

Beanは状態の値を破棄します。

ステートフル ステートフルステートフル

ステートフルSession Beanのライフ・サイクルのライフ・サイクル のライフ・サイクルのライフ・サイクル

Session Beanのライフ・サイクルは、そのBeanのホーム・インタフェースに定義されてい

るcreate()メソッドがクライアントによって起動されたときに始まります。このメソッド

起動を受けて、コンテナは次の処理を実行します。

1. Session Beanインスタンス用のメモリー・オブジェクトを新規作成します。

2. Session BeanのsetSessionContext()メソッドを起動します。このメソッドは、

Session Beanインスタンスにセッション・コンテキスト・インタフェースへの参照を渡

します。そのインスタンスは、この参照を使用して、コンテナ・サービスと、クライア ントによって起動されたメソッドのコール元に関する情報を取得します。

3. EJBクライアントによってコールされたcreate()メソッドに対応する、Session Bean のejbCreate()メソッドを起動します。

準備状態準備状態準備状態 準備状態

Session Beanインスタンスが作成されると、そのインスタンスはライフ・サイクルの準備状

態になります。この状態では、EJBクライアントがリモート・インタフェースに定義されて いるBeanのビジネス・メソッドを起動することができます。この状態にあるコンテナのア クションは、メソッドの起動がトランザクションに基づいているかどうかによって決まりま す。

トランザクション・メソッドの起動 トランザクション・メソッドの起動トランザクション・メソッドの起動 トランザクション・メソッドの起動

クライアントがトランザクション・ビジネス・メソッドを起動すると、Session Beanインス タンスはトランザクションに関連付けられます。Beanインスタンスとトランザクションと の関連付けは、そのトランザクションが完了するまで維持されます。また、EJBクライアン トが同じBeanインスタンスに対して別のメソッドを起動しようとするとエラーが発生しま す。そのメソッドを起動すると、Beanインスタンスはコンテナによって別のトランザク ションに関連付けられるか、またはどのトランザクションにも関連付けられなくなります。

その後、コンテナによって次のメソッドが起動されます。

1. Session BeanにSessionSynchronizationインタフェースが実装されている場合は、

afterBegin()メソッドを起動します。

2. Beanのリモート・インタフェースに定義されている、EJBクライアントによってコール されたビジネス・メソッドに対応するBeanクラスのビジネス・メソッドを起動します。

3. Session BeanにSessionSynchronizationインタフェースが実装されている場合は、

そのBeanインスタンスのbeforeCompletion()メソッドを起動します。

トランザクション・サービスによってトランザクションのコミットが試行され、その結果、

コミットまたはロールバックのどちらかが実行されます。トランザクションが完了すると、

コンテナがBeanのafterCompletion()メソッド(そのBeanに

SessionSynchronizationインタフェースが実装されている場合)を起動し、トランザ クションの完了ステータス(コミットまたはロールバック)をafterCompletion()メ ソッドに渡します。

ロールバックが実行された場合、ステートフルSession Beanでは、トランザクションの開始 前にそのBeanインスタンスに格納されていた値に対話の状態をロールバックできます。ス テートレスSession Beanでは対話の状態が維持されないため、ロールバックについて考慮す る必要はありません。

非トランザクション・メソッドの起動 非トランザクション・メソッドの起動非トランザクション・メソッドの起動 非トランザクション・メソッドの起動

クライアントが非トランザクション・ビジネス・メソッドを起動すると、コンテナによって そのBeanクラスの対応するメソッドが起動されます。

プール状態 プール状態プール状態 プール状態

コンテナには、どのEnterprise Beanインスタンスをメモリーに保持するかを管理する高度 なアルゴリズムが備わっています。コンテナは、ステートフルSession Beanインスタンスが メモリーで不要になったことを判断すると、そのBeanインスタンスのejbPassivate() メソッドを起動し、Beanインスタンスを保留プールに移動します。ステートフルSession Beanインスタンスがトランザクションと関連付けられている場合、そのBeanインスタンス は非アクティブ化できません。

クライアントがステートフルSession Beanの非アクティブ化されたインスタンスでメソッド を起動すると、コンテナによってそのインスタンスがアクティブ化されます。このアクティ ブ化は、インスタンスの状態を回復してからBeanインスタンスのejbActivate()メソッ ドを起動することによって行われます。このメソッドから戻ると、そのBeanインスタンス は再度準備状態になります。

特定タイプのステートレスSession Beanインスタンスはすべて、同タイプの他のすべてのイ ンスタンスと同じ内容であるため、ステートレスSession Beanインスタンスが非アクティブ 化またはアクティブ化されることはありません。これらのインスタンスは、削除されるまで 常に準備状態になります。

削除 削除削除 削除

ステートフルSession Beanのライフ・サイクルは、そのBeanのホーム・インタフェースま たはリモート・インタフェースに定義されているremove()メソッドをEnterprise Beanク ライアントまたはコンテナがコールすると終了します。このメソッド起動を受けて、コンテ ナがBeanインスタンスのejbRemove()メソッドをコールします。コンテナは、このメ ソッドによってステートレスSession Beanを終了したり、後で使用するためにプールしてお くこともできます。

コンテナでは、EJBオブジェクトの存続期間が過ぎた後に、そのインスタンスに対して削除 メソッドを暗黙的に起動できます。Session EJBオブジェクトの存続期間は、デプロイメン ト・ディスクリプタのタイムアウト属性で設定されます。

ステートレス ステートレス ステートレス

ステートレス Session Bean

Session Beanには、ステートレスSession Beanもあります。ステートレスSession Beanで

は、そのクライアントの情報や状態は維持されません。なんらかの目的を達成するため、ク ライアントによってステートレスSession Beanのメソッドが起動された場合、Beanのイン スタンス変数に値が保持されるのは、メソッド・コールの間に限られます。ステートレス

Session Beanでは、それらの値(または状態)がメソッドの完了後は保持されません。した

がって、ステートレスSession Beanではメソッドが起動されている間を除くと、すべてのイ ンスタンスの内容がまったく同じです。そのため、ステートレスSession Beanは多数のクラ イアントに対応できます。コンテナにステートレスBeanインスタンスのプールを維持し、

そこから任意のクライアントにインスタンスを割り当てることができます。

ステートレス ステートレスステートレス

ステートレスSession Beanのライフ・サイクルのライフ・サイクル のライフ・サイクルのライフ・サイクル

ステートレスSession Beanのライフ・サイクルには、次の2つの状態があります。

非存在状態

メソッド起動可プール状態

Beanインスタンスが非存在状態にあるときは、まだインスタンス化されていないことを意 味します。Beanインスタンスがコンテナによってインスタンス化され、クライアント・リ クエストに対応できるようになると、そのインスタンスはメソッド起動可プール状態になり ます。ステートレスSession Beanを非存在状態からメソッド起動可プール状態へと移行する ために、コンテナによって次の3つの操作が実行されます。

1. ステートレスBeanクラスでClass.newInstance()メソッドを起動します。

2. BeanインスタンスでSessionBean.setSessionContext(SessionContext context)メソッドを起動します。

3. BeanインスタンスでejbCreate()メソッドを起動します。