JBoss EJB 3.0と拡張機能

  ステートフルセッションBean
はじめに

ステートフルセッションBeanは内部状態を保持するセッションBeanです。クライアントが同じBeanスタブに対してメソッド呼び出しを行うと、コンテナ内の常に同じBeanインスタンスに呼び出しが渡されます。つまり、Beanインスタンスのすべてのフィールド変数は、クライアントアプリケーションがBeanスタブ(ローカルクライアントの場合は参照)を持ち続ける間は値を保持します。ステートフルセッションBeanは次のようなアプリケーションで、状態を追跡するためによく使われます。

  • Webアプリケーションでは、サーブレット(またはJSPページ)でBeanスタブをHttpSessionオブジェクトの属性として格納します。こうすることで、HTTPセッションの状態をBeanインスタンスに保持し、追跡することができます。
  • リッチクライアントJavaアプリケーション(たとえばSwingアプリケーション)では、アプリケーション独自のセッションを作り、そこにステートフルセッションBeanのスタブを保持します。
サンプルアプリケーション

このトレイルでは、同じセッションで行った、過去の計算履歴を記録する投資計算プログラムを作成してみましょう。同じセッションからJSPページにアクセスするといつも同じ投資計算Beanのスタブを取得し、セッションの履歴データをEJB 3.0コンテナ内の同じBeanインスタンスからロードします。

状態プロパティを持つインタフェース

Calculatorインタフェースは、セッションBeanのローカルビジネスインタフェースです。セッションの状態プロパティにアクセスするメソッドを追加することに注目してください。<Integer><Double>ArrayList内のオブジェクトの型を示します。JDK 1.5の総称(generics)についてはSunのWebサイトをご覧ください。


public interface Calculator {

  public double calculate (int start, int end, 
                  double growthrate, double saving);

  public ArrayList <Integer> getStarts ();
  public ArrayList <Integer> getEnds ();
  public ArrayList <Double> getGrowthrates ();
  public ArrayList <Double> getSavings ();
  public ArrayList <Double> getResults ();

}
ステートフルセッションBeanの実装

StatefulCalculatorステートフルBeanの実装はとても率直なコードです。実装クラスを@Statefulでアノテーションし、ArrayListオブジェクトを使ってセッションBeanインタフェースで定義したBeanのプロパティを記述します。ArrayListオブジェクトは、クライアントセッションの開始時にBeanインスタンスが作成される際に初期化されます。次に示すのは、StatefulCalculatorクラスの全コードです。ステートフルセッションBeanはSerializableインタフェースを実装することを忘れないでください。使用中でないBeanインスタンスを、状態を保持したまま外部媒体に保存するには、コンテナはオブジェクトをシリアライズする必要があるからです。


@Stateful
public class StatefulCalculator implements Calculator, Serializable {

  public ArrayList <Integer> starts = new ArrayList <Integer> ();
  public ArrayList <Integer> ends = new ArrayList <Integer> ();
  public ArrayList <Double> growthrates = new ArrayList <Double> ();
  public ArrayList <Double> savings = new ArrayList <Double> ();
  public ArrayList <Double> results = new ArrayList <Double> ();

  public double calculate (int start, int end, 
                           double growthrate, double saving) {
    
    // calculate the result ...
    
    starts.add(Integer.valueOf(start));
    ends.add(Integer.valueOf(end));
    growthrates.add(Double.valueOf(growthrate));
    savings.add(Double.valueOf(saving));
    results.add(Double.valueOf(result));

    return result;
  }

  public ArrayList <Integer> getStarts () {
    return starts;
  }

  // Other getter methods for the attributes ...
}
クライアント

JSPクライアントでは、StatefulCalculatorのBeanスタブを取得し、HttpSessionオブジェクトに関連付けます。こうすることにより同じセッションからは常に同じスタブ、つまりコンテナ内の同じBeanインスタンスにアクセスできます。次に示すのはJSPページの抜粋です。


Calculator cal =
      (Calculator) session.getAttribute("sfsb_cal");
if (cal == null) {
  try {
    InitialContext ctx = new InitialContext();
    cal = (Calculator) ctx.lookup(
            "EJB3Trail/StatefulCalculator/local");
    session.setAttribute ("sfsb_cal", cal);
  } catch (Exception e) {
    e.printStackTrace ();
  }
}

// Make use of the cal object
ソースコード参照

EJBサーバ

EJBクライアント

  • calculator.jsp: 投資計算セッションBeanのクライアント
まとめ

このトレイルでは、WebアプリケーションでステートフルセッションBeanを使ってユーザセッションの履歴を管理する方法を議論しました。セッションBeanのライフサイクルは、セッションBeanの内部状態を管理するためのとても重要なコンセプトです。では続けて、次のトレイルに行ってみましょう。