セッション Bean 入門

このトピックではセッション Bean の開発の概要について説明します。内容は以下のとおりです。


セッション Bean とは

セッション Bean は、サーバ上のクライアントのビジネス タスクを実行するために使用されます。一般的にセッション Bean は、製品の注文やコースへのサインアップなど、ある特定のタイプのアクティビティを実装しており、ビジネス ルールを実行するにあたって、エンティティ Bean を呼び出します。たとえば、製品の注文には、おそらく格納されている製品、顧客、クレジット カードなどの情報が必要となり、一方コースへのサインアップには、おそらく生徒やコースを表すエンティティ Bean の呼び出しが必要となります。

Workshop でセッション Bean を開発する

Workshop では、weblogic.ejb.GenericSessionBean を拡張し、javax.ejb.SessionBean を実装するクラスを作成することによってセッション Bean を開発します。このクラスには、EJB の特性を指定する @Session、@JndiName、および @FileGeneration アノテーション (さらに必要に応じて他のアノテーション) を追加します。

[WebLogic セッション Bean] テンプレートを使用することによって、IDE で簡単に開発を開始できます。テンプレートを使用する場合、IDE では次のようなコードが生成されます。

/**
 * Workshop によって自動生成される GenericSessionBean
 * サブクラス。
 * 
 * ejbCreate() メソッドを完成させ、必要なビジネス メソッドをすべて追加し、
 * @Session、@JndiName、および @FileGeneration アノテーションを確認して、
 * 設定値が目的の用途に適合していることを確認する。
 */
@Session(ejbName = "MySessionBean")
@JndiName(remote = "ejb.MySessionBeanRemoteHome")
@FileGeneration(remoteClass = Constants.Bool.TRUE, 
        remoteHome = Constants.Bool.TRUE, 
        localClass = Constants.Bool.FALSE, 
        localHome = Constants.Bool.FALSE)
public class MySessionBean 
    extends GenericSessionBean 
    implements SessionBean {
    
    private static final long serialVersionUID = 1L;

    /*
     * (non-Javadoc)
     * 
     * @see weblogic.ejb.GenericSessionBean#ejbCreate()
     */
    public void ejbCreate() {
        // 重要 : ここにコードを追加する
    }

    // 重要 : ビジネス メソッドを追加する
}

注意 : [WebLogic セッション Bean] テンプレートを使用するには、[プロジェクト・エクスプローラ] でその Bean が存在するパッケージを右クリックし、[新規|その他] を選択して [EJB] を展開してから [WebLogic セッション Bean] をクリックします。

コードには、一般的に使用されるクラスレベルのアノテーション属性の値が含まれています。このコードを出発点として使用して、ビジネス ロジック用のメソッドなどのコードを環境に合わせて書き換えます。

Workshop は、これらのアノテーションを使用して、EJB セッション Bean で必要なインタフェースと記述子ファイルを生成します。以下の節では、これらのセッション Bean の構成要素と特性について説明します。

ステートフルとステートレス

セッション Bean には、ステートフルとステートレスの、2 種類があります。ステートフル セッション Bean は会話状態を保持します。つまり、ステートフル セッション Bean は、あるメソッドから次のメソッドに移るまで、呼び出し側のクライアント アプリケーションを記憶しています。ステートフル セッション Bean では、あるメソッドによって生成された結果は、同じクライアントによって呼び出された、それ以前のメソッドの結果と共存関係にある可能性があります。ステートフル セッション Bean はクライアントとのこの会話を、会話がタイムアウトになるか、またはクライアントが Bean の remove メソッドを呼び出すことで明示的に会話を終了するまで保持します。

それに対して、ステートレス セッション Bean はいかなる会話状態をも保持しません。つまり、どのクライアントがメソッドの 1 つを呼び出したかを記憶せず、メソッド間の初期状態を保持しません。各セッション Bean メソッドは独立しており、クライアント入力は、パラメータで渡されるデータのみです。

注意 : 新しい EJB を作成する場合、デフォルトではステートレス Bean が作成されます。

ステートフル セッション Bean は、会話の存続期間中は、特定のクライアントに関連付けられています。一方、ステートレス セッション Bean が特定のクライアントに関連付けられているのは、メソッドが実行されている期間のみです。メソッドの実行完了後は、ステートレス セッション Bean では別のクライアント アプリケーションに対応する準備が整っています。したがって、少数のステートレス セッション Bean を使って、多数のクライアント アプリケーションに対応できます。このため、ステートレス セッション Bean は、ステートフル セッション Bean よりも一般に好まれる傾向があります。クライアント アプリケーションがページ フローまたは会話形式の Web サービスの場合、会話状態はクライアント アプリケーション自身によって記憶されます。そのため、クライアント アプリケーションのユーザとの継続的なセッションを保持しつつ、ステートレス セッション Bean を使用することが可能です。

Workshop では、@Session アノテーションのタイプ属性を使用して、セッション Bean がステートフルかステートレスかを指定します。

ホーム インタフェースとビジネス インタフェース

エンティティ Bean と同様に、セッション Bean にはローカル ホーム インタフェース、ローカル ビジネス インタフェース (または単にローカル インタフェース)、リモート ホーム インタフェース、およびリモート ビジネス インタフェース (または単にリモート インタフェース) と呼ばれる 4 種類のインタフェースを指定できます。ローカル インタフェースは、同一のアプリケーション内で定義される他の EJB、EJB コントロール、Web サービス、およびページ フローによって使用可能な Bean のメソッドを定義します。つまり、セッション Bean を定義し、それを当該アプリケーション内だけで使用する予定の場合は、ローカル インタフェースを使用できます。対照的に、リモート インタフェースは、他のアプリケーションで定義される EJB、EJB コントロール、Web サービス、およびページ フローによって呼び出される Bean のメソッドを定義します。

セッション Bean に対して定義したインタフェースは、[プロパティ] ビューで表示および設定できます。セッション Bean のクラス宣言にカーソルを合わせ、FileGeneration アノテーションの属性値リストまでスクロールします。ローカル とリモート インタフェースの名前は、localHomeName および remoteHomeName 属性で指定します。これらの属性を設定すると、@FileGeneration アノテーションの値がソース コードに表示されます。

セッション Bean の (リモートまたはローカル) ホーム インタフェースには、Bean インスタンスへの参照を取得するのに使用される create メソッドが含まれます。(リモートまたはローカル) ビジネス インタフェースには、特定のビジネス ロジックのカプセル化に使用されるコンポーネント メソッドが含まれます。

作成メソッド

ステートレス セッション Bean に対しては、厳密に 1 つの ejbCreate() メソッドをパラメータなしで定義しなければなりません。このメソッドは、セッション Bean インスタンスへの参照を取得するために呼び出す必要があります。参照を取得すると、セッション Bean のコンポーネント メソッドを呼び出せるようになります。EJB コントロールを介してステートレス セッション Bean を呼び出す場合は、create メソッドを明示的に呼び出す必要はありません。コンポーネント メソッドを呼び出すと、EJB コントロールが自動的に参照を作成します。

ステートレス セッション Bean には、少なくとも 1 つの ejbCreate メソッドが必要であり、またエンティティ Bean と同様、複数の ejbCreate メソッドを使用できます。セッション Bean インスタンスへの参照を取得するためにこれらのメソッドの 1 つを呼び出してからでなければ、セッション Bean のコンポーネント メソッドを呼び出すことはできません。EJB コントロールを介してステートフル セッション Bean を呼び出す場合は、まず create メソッドの (1 つ) を呼び出して、参照を取得する必要があります。

ステートレス セッション Bean の場合とは異なり、参照を取得するためにステートフル セッション Bean の create メソッドを呼び出し、その後いくつかのコンポーネント メソッドを呼び出す場合、各メソッドは必ず、サーバ上の同一の Bean インスタンスによって処理されます。詳細については、「セッション Bean のライフサイクル」を参照してください。

コンポーネント メソッド

コンポーネント メソッドは、セッション Bean インスタンスで呼び出されるビジネス メソッドです。ビジネス メソッドの簡単な一例としては、reserveTickets(customer, movieName, date) があります。これは映画のチケット予約に使用されます。

原則として、ステートフル セッション Bean とステートレス セッション Bean で、コンポーネント メソッドに違いはありません。ただし、ステートレス セッション Bean のコンポーネント メソッドには、ビジネス ロジックを実行するために必要となるデータをすべてパラメータとして渡す必要があるのに対し、ステートフル セッション Bean のコンポーネント メソッドにはその必要がありません。たとえばステートフル セッション Bean では、メソッド reserveTickets() を使用して映画のチケット予約ができます。コンポーネント メソッド setCustomer(customer) が呼び出されて顧客データが設定された後、setMovie(name) が呼び出されて映画が選択され、setDate(date) が呼び出されて映画の時間が設定されます。ステートレス セッション Bean では、これらのパラメータは、reserveTickets(customer, movieName, date) のように、実際に予約を行うコンポーネント メソッドに渡す必要があります。

その他のメソッド

セッション Bean には、いくつかのコールバック メソッドの他に、特定の処理中に EJB コンテナによって呼び出される、いくつかのあらかじめ定義されたメソッドがあります。セッション Bean はこれらのメソッドを実装する必要があります。WebLogic では、これらのコールバック メソッドはデフォルトで自動的に実装されます。多くの場合、これらのメソッドを使用する必要はありません。これらのメソッドの詳細については、「セッション Bean の定義」および「セッション Bean のライフサイクル」を参照してください。


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