セッション Bean のライフサイクル

このトピックでは、セッション Bean のライフサイクル メソッドを取り上げます。内容は以下のとおりです。


ステートレス セッション Bean のライフサイクル

下の図に、ステートレス セッション Bean のライフサイクルを示します。ステートレス セッション Bean には、2 つの状態があります。

各種の状態の期間中に利用可能なメソッドの他、さまざまな状態遷移について以下で説明します。

存在しない状態から準備完了状態へ移行する

EJB コンテナは、準備完了プールに入れるべきステートレス セッション Bean インスタンスを作成する際に、コールバック メソッド public void setSessionContext(SessionContext ctx) を呼び出します。このメソッドには、パラメータ javax.ejb.SessionContext が指定されています。これはセッション コンテキストへの参照、すなわち EJB コンテナへのインタフェースを含み、セッション Bean オブジェクトの自己参照に使用できます。javax.ejb.SessionContext の詳細については、お好きな J2EE ドキュメントおよび http://java.sun.com にある API リファレンスを参照してください。

コールバック メソッド setSessionContext の呼び出し後、EJB コンテナはコールバック メソッド ejbCreate を呼び出します。このコールバック メソッドを実装すると、たとえば「セッション Bean の定義」に示すように、セッション Bean によって呼び出される他の EJB のホーム インタフェースを取得できます。ejbCreate メソッドはセッション Bean の有効期間中に 1 回だけ呼び出され、クライアント アプリケーションによる create メソッドの呼び出しに関連付けられてはいません。ステートレス セッション Bean の場合、create メソッドを呼び出すとすでに準備完了プールに入っている Bean への参照が返されます。新しい Bean インスタンスは生成しません。ステートレス セッション Bean インスタンスの管理は、すべて EJB コンテナが行います。

準備完了状態

準備完了状態の Bean インスタンスは、クライアント要求をサービスする、つまりコンポーネント メソッドを実行できます。クライアントがビジネス メソッドを呼び出すと、EJB コンテナは利用可能な Bean インスタンスを割り当ててこのビジネス メソッドを実行します。実行後は、セッション Bean インスタンスでは別のビジネス メソッドを実行する準備が整っています。

準備完了状態から存在しない状態へ移行する

EJB コンテナは、準備完了プール内のセッション Bean インスタンスの数を減らすと決定すると、Bean インスタンスでガベージ コレクションの準備を整えます。またその直前に、コールバック メソッド ejbRemove を呼び出します。セッション Bean が、ガベージ コレクション前に何らかのクリーンアップ アクションの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。コールバック メソッドはクライアントが呼び出した remove メソッドには関連付けられていません。ステートレス セッション Bean の場合、remove メソッドを呼び出すと、すでに準備完了プールにあった Bean インスタンスへの参照が無効化されますが、ステートレス セッション Bean の管理はすべて EJB コンテナが行うため、Bean インスタンスが準備完了状態から存在しない状態に移ることはありません。

ステートフル セッション Bean のライフサイクル

下の図に、ステートフル セッション Bean のライフサイクルを示します。次の状態があります。

各種の状態の期間中に利用可能なメソッドの他、さまざまな状態遷移について以下で説明します。

存在しない状態から準備完了状態へ移行する

クライアントがステートレス セッション Bean に対して create メソッドを呼び出すと、EJB コンテナは新しいインスタンスを作成してコールバック メソッド public void setSessionContext(SessionContext ctx) を呼び出します。このメソッドには、パラメータ javax.ejb.SessionContext が指定されています。これはセッション コンテキストへの参照、すなわち EJB コンテナへのインタフェースを含み、セッション Bean オブジェクトの自己参照に使用できます。javax.ejb.SessionContext の詳細については、お好きな J2EE ドキュメントおよび http://java.sun.com にある API リファレンスを参照してください。コールバック メソッド setSessionContext の呼び出し後、EJB コンテナは create メソッドのシグネチャに一致するコールバック メソッド ejbCreate を呼び出します。

準備完了状態

準備完了状態にあるステートフル Bean インスタンスは、会話の存続期間中は、特定のクライアントに関連付けられています。この会話中、インスタンスはクライアントによって呼び出されたコンポーネント メソッドを実行できます。

アクティブ化とパッシベーション

より最適にリソースを管理するため、EJB コンテナは非アクティブなステートフル セッション Bean インスタンスを準備完了状態からパッシブ状態に移行させることによる、パッシベーションを行うことがあります。セッション Bean インスタンスがパッシベーションされると、その (非遷移の) データがシリアライズされてディスクに書き込まれ、その後 Bean インスタンスはメモリからパージされます。シリアライズの直前に、コールバック メソッド ejbPassivate が呼び出されます。セッション Bean が、パッシベーション前に何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。

パッシベーション後にクライアント アプリケーションがビジネス メソッドを呼び出すことによって会話を続行する場合は、パッシベーションされた Bean インスタンスは再アクティブ化され、ディスクに格納されていたデータを使って、Bean インスタンスの状態が元に戻されます。状態が元に戻った直後に、コールバック メソッド ejbActivate が呼び出されます。セッション Bean が、アクティブ化の前に何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。セッション Bean インスタンスの呼び出し側 (クライアント アプリケーションまたは別の EJB) には、パッシベーション (および再アクティブ化) が行われたことは伝わりません。

ステートフル セッション Bean が NRU (最近未使用) cache-type アルゴリズムを使用するように設定されている場合、セッション Bean はパッシブ状態にある間にタイムアウトできます。その場合は、存在しない状態に移行、つまり削除されます。削除の直前、EJB コンテナはコールバック メソッド ejbRemove を呼び出します。ステートフル セッション Bean が LRU (最長時間未使用) アルゴリズムを使用するように設定されている場合、セッション Bean はパッシブ状態にある間にタイムアウトできません。このセッション Bean は、タイムアウトすると、必ず準備完了状態からパッシブ状態に移行されます。

正確なタイムアウトは、@Session アノテーションの idleTimeoutSeconds 属性で設定できます。cache-type アルゴリズムは、同じアノテーションで cacheType 属性を使用して設定できます。

準備完了状態から存在しない状態へ移行する

クライアント アプリケーションがステートフル セッション Bean に対して remove メソッドを呼び出すと、Bean は会話を終了し、EJB コンテナにインスタンスを削除するよう指示します。インスタンス削除の直前、EJB コンテナはコールバック メソッド ejbRemove を呼び出します。セッション Bean が、削除前に何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。

NRU (最近未使用) cache-type アルゴリズムを使用するように設定された非アクティブのステートフル セッション Bean は、タイムアウトでき、その結果、存在しない状態に移行、すなわち削除されます。削除の直前、EJB コンテナはコールバック メソッド ejbRemove を呼び出します。LRU (最長時間未使用) アルゴリズムを使用するように設定されたステートフル セッション Bean がタイムアウトした場合、この Bean は必ずパッシブ状態に移行し、削除はされません。

正確なタイムアウトは、@Session アノテーションの idleTimeoutSeconds 属性を使用して設定できます。cache-type アルゴリズムは、同じアノテーションで cacheType 属性を使用して設定できます。

関連トピック

エンティティ Bean のライフサイクル

weblogic.ejbgen.Session


さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。