Topics
Enterprise Architecture
Enterprise JavaBeans 3.0仕様入門
Pages:
1,
2,
3,
4,
5,
6
ステートフルセッションBeanは、その内部状態を維持するセッションBeanです。クライアントが同じBeanスタブに対してメソッド呼び出しを 依頼すると、呼び出しは常に、コンテナ内の同じBeanインスタンスにトンネルされます。そのため、Beanインスタンス内のすべてのフィールド変数はそ れぞれの値を、クライアントアプリケーションがBeanスタブ(または、ローカルクライアントの場合は参照)を保持する間ずっと保持し続けます。
EJB 3.0 APIでは、ステートフルセッションBeanのビジネスインタフェースは通常のJavaインタフェースでもあります。ビジネスインタフェースはステートフ ルセッションBeanに対して必須です。ただし、それを定義することが常に必要とは限りません。開発者が定義しない場合は自動的に生成されます。生成され るインタフェースのタイプ(ローカルまたはリモート)はBeanクラスの注釈から決定され、注釈がなければローカルインタフェースになります。自動生成さ れるビジネスインタフェースにはBeanクラスのすべてのpublicメソッドが取り込まれます。
ステートフルセッションBeanにはホームインタフェースは不要です。
ステートフルセッションBeanには、ステートフルであることを示す注釈を付ける必要があります。または、ステートフルセッションBeanであることをデプロイメント記述子で定義する必要があります。Beanクラスは
javax.ejb.Session Beanインタフェースを実装する必要はありません。ステートフルセッションBeanは
SessionSynchronizationインタフェースを実装する場合があります。
ステートフル
TraderBeanの実装はシンプルです。この例では、実装クラスに
@Stateful注 釈を付け、セッションBeanインタフェースに定義されたBeanプロパティをバックアップするために(IntegerやStringなどの)Javaオ ブジェクトを使用しました。クライアントセッションの開始時、個々のBeanインスタンスが作成されるとそのインスタンスに対してJavaオブジェクトが 初期化されます。次に示すのは、
TraderBeanクラスの完全なコードです。重要な注意点として、ステートフルセッション Beanクラスはシリアライズ可能なインタフェースを実装する必要があります。これは、コンテナがBeanインスタンスをシリアライズして格納し、インス タンスが使用中でないときに状態情報を保持できるようにするためです。
@Stateful
public class TraderBean implements Trader, Serializable {
public String symbol = "";
public int quantity = 0;
public void buy (String symbol, int quantity){
System.out.println("Buying "+quantity+ " of "+ symbol);
}
public void sell (String symbol, int quantity);{
System.out.println("Selling "+quantity+ " of "+ symbol);
}
public String getSymbol(){
return symbol;
}
public int getQuantity(){
return quantity;
}
// Other getter methods for the attributes ...
}
サンプルのクライアントを次に示します。
Trader tr = null;
if (tr == null) {
try {
InitialContext ctx = new InitialContext();
tr = (Trader) ctx.lookup(
Trader.class.getName());
} catch (Exception e) {
e.printStackTrace ();
}
}
// Make use of the tr object
ステートフルセッションBeanは、作成、破棄、アクティベーション、パッシベーションの各ライフサイクルイベントに対するコールバックをサポート します。EJB 3.0仕様では、Beanがそのライフサイクルの間にコールバックメソッドを指定するために使用できる各種注釈が定義されています。注釈が付けられたメ ソッドは、コンテナによって自動的に、セッションBeanのライフサイクルの各段階で呼び出されます。開発者は以下の注釈を使用して、Beanクラス内の メソッドをタグ付けすることができます。
@PostConstruct:この注釈が付いたメソッドは、Beanのインスタンス化の直後にコンテナによって呼び出されます。この注釈はステートレスセッションBeanとステートフルセッションBeanの両方に対して使用できます。
@PreDestroy:この注釈が付いたメソッドは、使用されていないかまたは期限切れのBeanインスタンスをコンテナがそのオブジェクトプールから破棄する前に呼び出されます。この注釈はステートレスセッションBeanとステートフルセッションBeanの両方に対して使用できます。
@PrePassivate:ステートフルセッションBeanインスタンスのアイドル状態が長すぎる場合、コンテナは そのインスタンスをパッシブ化し、インスタンスの状態をキャッシュに格納する場合があります。この注釈でタグ付けされたメソッドは、コンテナがBeanイ ンスタンスをパッシブ化する前に呼び出されます。この注釈はステートフルセッションBeanでのみ使用できます。
@PostActivate:パッシブ化されたステートフルセッションBeanをクライアントが再び使用するとき、新 しいインスタンスが作成され、Beanの状態が復元されます。この注釈でタグ付けされたメソッドは、アクティブ化されるBeanインスタンスの準備ができ た時点で呼び出されます。この注釈はステートフルセッションBeanでのみ使用できます。
@Init:この注釈はステートフルセッションBeanの初期化メソッドを指定します。
@PostConstruct注釈との違いは、1つのステートフルセッションBean内の複数のメソッドに
@Initをタグ付けできる点です。ただし、各Beanインスタンスの
@Initメソッドは同時に1つしか呼び出すことができません。EJB 3.0コンテナは、Beanの作成方法に応じて、どの
@Initメソッドを呼び出すかを決定します(詳細についてはEJB 3.0仕様を参照)。
@PostConstructメソッドは
@Initメソッドの後に呼び出されます。
ステートフルセッションBeanには、もう1つのライフサイクルメソッド注釈として
@Removeタグがあります。これはコールバックメソッドではありません。なぜなら、コンテナではなくアプリケーションがBeanスタブ上の
@Removeメソッドを呼び出して、コンテナのオブジェクトプール内のBeanインスタンスを削除するからです。