特集
2004/02/13 16:02:00 更新


特集:第2回 インタフェースとBeanクラス作成でEJBの核を知る (1/3)

第2回目は、具体例として単純なソースコードを挙げ、Enterprise Bean作成のための手順を示していく。次回に解説するJBossインストール後に実行環境として利用していくものだ。

 Java特集「JBossで学ぶEJB入門」第1回目では、「EJBの仕組みを知ろう」と題し、EJBについての基礎とやり取りの仕組みについてを紹介した。今回は、プログラミングの中核となる実践に踏み込み、Enterprise Beanにつながるホームインタフェース、リモートインタフェース、Beanクラス、3つの作成方法について解説する。

見 出 し 一 覧
1. セッションBeanの作成
2. ステートレスセッションBeanとステートフルセッションBeanとの違い
3. Beanクラスを作る
4. リモートインタフェースを用意する
5. ホームインタフェースを用意する
6. 配備記述子を用意する

セッションBeanの作成

 EJBには具体的に作り込み、動作させてみないと分からない面も多い。そこでまず最初に簡単なセッションBeanの作り方を解説する。その課程から理解を深めていってほしい。

 ここではごく簡単に次のような2つの引数を取り、その和を返すというメソッド名addData実装のセッションBeanを作る。


int addData (int a, int b)
{ return a + b; }


メソッドの名前は任意の名前で構わないが、「ejb」から始まるものは避けるようにする。このメソッドは、EJBによって特別な用途で予約されているためだ。

ステートレスセッションBeanとステートフルセッションBeanとの違い

 セッションBeanを作り始める前に、ステートレスセッションBeanとステートフルセッションBeanの違いについて説明しておこう。

 ステートレスセッションBeanとは、Enterprise Beanオブジェクトが解放された時、本当にそのオブジェクトをメモリ上から削除してしまうのではなく、内部に保存しておき、次にクライアントがEnterprise Beanオブジェクトを利用する際に使い回すもののことだ(Fig.7)。

fig07.gif

Fig.7■ステートレスセッションBean


 このステートレスセッションBeanは、Fig.7に示したようにEJBコンテナ内に幾つかのEnterprise Beanのインスタンスがあり、メソッドが呼び出された時に、ほかで再利用して使い回す。そのため、改めてインスタンスを用意する必要なく高速化を図れるわけだ。

 また、Fig.7に示したように、回収されたインスタンスはプーリングされ、次の呼び出しに備える。プーリングされることを「非アクティブ化」、プーリングから取り出されて再利用されることを「アクティブ化」という。ステートレスセッションBeanを使う場合に注意したいのは、フィールドの扱いだ。たとえば、次のようなBeanの実装があるとしよう。


public class FooBean implements SessionBean
{
    private int value;
    public setValue(int v)
    {
        value = v;
    }
    public int getValue()
    {
        return value;
    }
}

 この例では、setValueメソッドがあり、値をvalueフィールドに設定している。たとえば、あるクライアントがsetValue(1)として呼び出した場合、valueフィールドの値は「1」となる。そして、次にgetValueメソッドを呼び出せば、値として「1」が得られる。

 このような実装は、ステートレスセッションBeanでは正しく動作しない可能性がある。なぜならば、setValueメソッドを呼び出した時と、getValueメソッドを呼び出した時とでは、異なるインスタンスを使うことがあり得るためだ。

 たとえば、クライアントがsetValue(1)を呼び出したとしよう。この時、valueフィールドの値は確かに「1」と設定される。しかし、メソッドの呼び出しが終わると、EJBコンテナはできる限り効率よくEnterprise Beanを使おうとするため、いちどクライアントから切り離してプーリングする。

 次にクライアントがgetValueメソッドを呼び出したとする。この時プーリングしている中から、適当なEnterprise Beanのインスタンスがクライアントに渡される。このため、「setValue(1)」を呼び出した際に同じインスタンスではない物が利用されることがあるのだ。getValueメソッドの戻り値は「1」とならない可能性がある(Fig.8)。

fig08.gif

Fig.8■ステートレスセッションBeanでは保存した値が失われたり変化してしまう


 つまりステートレスセッションBeanでは、フィールドを使い、各クライアントに固有の値を保存することができないことを意味する。


ステートレスセッションBeanは、フィールドを使えないという意味ではない。各クライアントに固有の値を保持することができないだけであり、全クライアントに共通の値を保持するのは自由だ。プーリングからインスタンスを取り出すとき、どのインスタンスでも同じ値が設定されいるならば、まったく問題はない。

      | 1 2 3 | 次のページ

[大澤文孝,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.