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


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


 一方で、ステートフルセッションBeanは、通常のJavaBeansと同様、いちどインスタンスを使ってオブジェクトを得たならば、そのオブジェクトを破棄するまではほかのインスタンスが使われてしまうことがない。Fig.7に示したプーリング機構は利用されず、通常のJavaBeansと同様に、フィールドを使った値の保存ができるのだ。

 ステートフルセッションBeanは、フィールドを使えて値も保存できるため、通常のJavaプログラムと同じように実装でき、注意点が特にない。それに対し、ステートレスセッションBeanは、メソッドの呼び出しが終わると、次にメソッドを呼び出した時には、ほかのインスタンスが使われることがあることを念頭において実装する必要がある。

 実装時の注意点を考えれば、ステートフルセッションBeanのほうが扱いやすいといえる。しかしクライアントの数が多くなった場合を考慮すれば、効率が良いのはステートレスセッションBeanだ。

 たとえば、1000クライアントがEnterprise Beanを使っているとしよう。この際に1000クライアントの中でメソッドを呼び出している最中のクライアントが50クライアントであれば、ステートレスセッションBeanではEJBコンテナ内に50個のオブジェクトさえあればよい。それに対してステートフルセッションBeanの場合には1000個のオブジェクトが必要となる。

 つまりステートレスセッションBeanならば、実際にクライアントがオブジェクトの参照を持っいたとしても、オブジェクトの使い回しができるため、少ない数のオブジェクトで済むのだ(Fig.9)。

fig09.gif

Fig.9■ステートレスセッションBeanは少ないオブジェクトで済む


 このような理由から、ステートレスセッションBeanで済む場面では、極力ステートレスセッションBeanを使う。一方、メソッドの呼び出しをまたいで値を保存する必要がある場面では、ステートフルセッションBeanを使うべきだ。なお、ステートレスセッションBeanもステートフルセッションBeanもプログラミング方法はまったく同じだ。ステートレスかステートフルかは、配備記述子で指定する。そのため、実装後にはステートレスかステートフルかを変更することも可能だ。

Beanクラスを作る

 ひと通りの説明を終えたところで、セッションBeanを実際に作ってみよう。

 まずはBeanクラスから実装する。すでに解説したように、セッションBeanのBeanクラスは、SessionBeanインタフェースを実装したクラスとする。SessionBeanインタフェースは、次のメソッドを備える。

  • void ejbActivate()

 このオブジェクトがアクティブ化された時に呼び出される。

  • void ejbPassive()

 このオブジェクトが非アクティブ化されようとした時に呼び出される。

  • void ejbRemove()

 このオブジェクトが削除されようとしている時に呼び出される。

  • void setSessionContext(SessionContext ctx)

 SessionContextオブジェクトが設定された時に呼び出される。SessionContextオブジェクトには、EJBObjectオブジェクトを得るgetEJBObjectメソッドなどが用意されている。

 SessionBeanインタフェースには、これらのメソッドに加え、ejbCreateメソッドと、実際のビジネスロジック(ここでは先に示したaddDataメソッド)を実装する。全体のリストは、List 1のようになる。

List 1■SampleBean.java

package example.ejb;
import javax.ejb.*;
public class SampleBean implements SessionBean
{
        // SesionBeanインタフェースに必須のメソッド
        public void ejbRemove()
        {
                // 破棄されようとしているときの処理を記述する
        }
        public void ejbActivate()
        {
                // アクティブ化されたときの処理を記述する
        }
        public void ejbPassivate()
        {
                // 非アクティブ化されようとしているときの処理を記述する
        }
        public void setSessionContext(SessionContext ctx)
        {
                // SessionContextが設定されようとしているときの処理を記述する
        }
        // ejbCreateメソッド
        public void ejbCreate() throws CreateException
        {
                // 初期化に必要な処理を記述する
                // ちなみに初期化に失敗したならば、CreateException例外を
                // スローすると、Enterprise Beanのインスタンス化を中止できる
        }
        // 以下、ビジネスロジックのメソッド
        public int addData(int a, int b)
        {
                return a + b;
        }
}

 List 1を見ると分かるように、ejbXXXメソッドは中身が空であり、また、setSessionContextメソッドも空として存在する。初期化時や終了時などに何も処理をしなくてよいならば、このように空メソッドの実装で問題はない。

 ただし、ejbCreateメソッドに関しては、List 1にあるように、CreateException例外をthrowするようにしなければならないという決まりがある。

public void ejbCreate() throws CreateException {}

前のページ | 1 2 3 | 次のページ

[大澤文孝,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.