目次 | |

5. セションBeanのクライアントビュー

セションエンタプライズBeanのクライアントビューを示す。セションBean自体は,Beanの業務論理を実装する。 遠隔アクセス,セキュリティ,並行処理,トランザクションなどに対応する機能は,すべて,Beanのコンテナが提供する。

エンタプライズBeanのクライアントビューは,コンテナが実装するクラスによって提供されるが, コンテナ自体は,クライアントに透過的とする。

5.1 概観

クライアントにとっては,セションエンタプライズBeanは,非永続オブジェクトであって,サーバ上で実行する何らかの業務論理を実装する。 セションオブジェクトは,サーバ上で実行するクライアントプログラムの論理的拡張とする。セションオブジェクトは, クライアント間で共有されない。

クライアントは,セションBeanの遠隔インタフェースを通じて,セションエンタプライズBeanにアクセスする。 この遠隔インタフェースを実装するオブジェクトを,EJBオブジェクトと呼ぶ。EJBオブジェクトは, 遠隔Javaプログラム言語オブジェクトであって,遠隔オブジェクト呼出しのための標準JavaAPI[3]によって, クライアントからアクセスできる。

EJBオブジェクトは,生成から破壊まで,コンテナで生存する。クライアントには透過的だが,そのコンテナは,セキュリティ,並行処理, トランザクション,二次記憶装置へのスワッピングなどのサービスを,EJBオブジェクトに提供する。

各セションEJBオブジェクトは識別子をもつが,一般にコンテナのクラッシュ及び再始動を生き延びることはできないが, 高機能コンテナ実装では,クライアントに対し,コンテナ及びサーバのクラッシュを隠すことができる。

EJBオブジェクトに関するクライアントのビューは,記憶場所独立とする。EJBオブジェクトと同じJVMで実行するクライアントは, 計算機の同異にかかわらず異なるJVMで実行するクライアントと,同じAPIを使用する。

複数のEJBクラスをコンテナにインストールできる。コンテナは,クライアントのJNDIを通じて, インストール済みEJBクラスのホームインタフェースの参照を可能とする。各ホームインタフェースは, 対応EJBクラスのEJBオブジェクト生成及び除去のメソッドを提供する。

EJBオブジェクトに関するクライアントのビューは,エンタプライズBean及びそのコンテナの実装に関係なく,同じとする。

5.2 EJBコンテナ

EJBコンテナ(短縮してコンテナともいう。)は,エンタプライズBeansに対する“コンテナ”として機能するシステムとする。 複数のEJBクラスのエンタプライズBeansが,同一コンテナの中で生存できる。クライアントは,特定のEJBクラスのホームインタフェースを JNDIを使用して参照できる。コンテナは,責任をもって,インストールされたEJBクラスがJNDIを通じてクライアントに利用可能となる ものとする。

コンテナは,データベースでのレコード及びファイルシステムでのファイル又はディレクトリと同様に, エンタプライズBeanオブジェクトの生存する場所とする。

5.2.1 エンタプライズBeanのホームインタフェースの位置決め

クライアントは,JNDIを使用して,エンタプライズBeanのホームインタフェースを位置決めする。 例えば,Cart EJBオブジェクトのコンテナは,次のコードを使って位置決めされる。
        Context initialContext = new InitialContext();
        CartHome cartHome = javax.rmi.PortableRemoteObject.narrow(
                initialContext.lookup("applications/mall/freds-carts"),
                        CartHome.class);
クライアントのJNDI名前空間は,EJBクラスのホームインタフェースを含むとおりに構成され,EJBクラスは, ネットワーク上の複数の計算機に置かれた複数のEJBコンテナにインストールされる。EJBクラス及びEJBコンテナの実際の位置は, 一般にクライアントに透過的とする。

5.2.2 コンテナ提供者の定義

図5.1は,セションコンテナが,そのクライアントに提供するビューを表す。
 
5.1
図5.1 セションコンテナがクライアントに提供するビュー

5.3 ホームインタフェース

EJBコンテナは,コンテナにインストールされた各エンタプライズBeanのホームインタフェースを実装する。 コンテナによって,クライアントは,JNDIを通じてホームインタフェースを利用できる。ホームインタフェースによって, クライアントは,次のことが可能となる。

5.3.1 EJBオブジェクトの生成

ホームインタフェースは,EJBオブジェクトを生成する方法ごとに一つずつ,一つ以上のメソッドcreate()を定義する。 メソッドcreate()の引数は,通常は,生成されるEJBオブジェクトの状態を初期化するために使用する。

次の例は,単一メソッドcreate()を定義するホームインタフェースを表す。

        public interface CartHome extends javax.ejb.EJBHome{
                Cart create(String customerName, String account)
                        throws RemoteException, BadAccountException,
                                CreateException;
        }
次の例は,クライアントがインタフェースCartHomeのメソッドcreate()を使用して, 新しいEJBオブジェクトを生成する方法を示す。
        cartHome.create("John", "7506");

5.3.2 EJBオブジェクトの除去

インタフェースjavax.ejb.EJBHomeは,クライアントが, EJBオブジェクトを除去可能なメソッドをいくつか定義する。 さらに,クライアントは,インタフェースjavax.ejb.EJBObject上のメソッドremove()を使用して,EJBオブジェクトを除去してもよい。

5.4 EJBオブジェクト

クライアントは,エンタプライズBeanのクラスインスタンスに決して直接にはアクセスしない。常に,エンタプライズBean の遠隔インタフェースを使用して,エンタプライズBeanのインスタンスにアクセスする。エンタプライズBean の遠隔インタフェースを実装するクラスは,コンテナが提供する。このクラスが実装する分散オブジェクトを,EJBオブジェクトと呼ぶ。

EJBオブジェクトは,次をサポートする。

5.5 セションオブジェクトの識別性

セションオブジェクトは,生成したクライアントだけが使用する私的資源とすることが意図されている。 このため,セションEJBオブジェクトは,クライアントからは無名にみえる。一次キーとして識別性を公開する実体EJB オブジェクトとは対照的に,セションオブジェクトは,その識別性を隠ぺいする。

すべてのセションオブジェクトは,識別性を隠ぺいするので,セションオブジェクトにinder()を提供する必要はない。 セションオブジェクトのホームインタフェースは,メソッドfinder()を定義してはならない。

セションEJBオブジェクトハンドルは,永続的な記憶に直列化することによって,クライアントプロセスの寿命を越えて維持される。 ハンドルが後で非直列化されると,返されるセションEJBオブジェクトは,そのオブジェクトがサーバ上に存在する限り,作動する (タイムアウト又はサーバクラッシュがその前に生じた場合には,破壊されるかもしれない。)。

5.6 セションBeanのライフサイクルのクライアントビュー

クライアントの観点からみると,セションBeanオブジェクトのライフサイクルは次のとおりに示される。
 
図5.2 セションオブジェクトのライフサイクルのクライアントビュー

EJBオブジェクトは,生成されるまでは存在しない。オブジェクトがクライアントによって生成されると, クライアントは,新たに生成されたEJBオブジェクトへの参照を獲得する。

オブジェクトへの参照をもつクライアントは,次を実行できる。

存在しないEJBオブジェクトへの参照は無効とする。存在しないオブジェクトを呼び出そうとすると, javax.rmi.NoSuchObjectExceptionが投げられる。

5.7 セションBeanの生成及び使用

セションBeanの実行時オブジェクトの例を,図5.3に示す。
 
図5.3 セションBeanの実行時オブジェクトの例

クライアントは,Cartのホームインタフェースのメソッドcreate()を用いて,(ショッピングサービスを提供する) Cartセションオブジェクトを生成する。クライアントは,その後,このオブジェクトを使用して,買い物かごに商品を入れ,購入する。

クライアントがショッピングセションを作業マシンで開始し,後でホームマシンからこのセションを完了したい場合には, セションのハンドルを獲得し,ハンドルを直列化して自分のホームマシンに転送し,それを用いて元のCartへのアクセスを再確立すればよい。

JNDIのCartホームインタフェースを参照することから開始する例を,次に示す。この後で,ホームインタフェースを使用して, Cart EJBオブジェクトを生成し,商品を追加する。

        CartHome cartHome = javax.rmi.PortableRemoteObject.narrow(
                initialContext.lookup(...), CartHome.class);
        Cart cart = cartHome.create(...);
        cart.addItem(66);
        cart.addItem(22);
次に,このショッピングセションをホームで完了することにし,この買い物かごのセションへのハンドルを直列化して,ホームへメールする。
        Handle cartHandle = cart.getHandle();
        serialize cartHandle, attach to message and mail it home...
最後に,ホームでハンドルを戻して,買い物かごの中身を購入する。
        Handle cartHandle = deserialize from mail attachment...
        Cart cart = (Cart) cartHandle.getEJBObject();
        cart.purchase();
        cart.remove();

目次 | |