前へ     目次     索引     DocHome     次へ     
iPlanet Application Server 開発者ガイド



第 4 章   Enterprise JavaBeans の紹介


この章では、iPlanet Application Server アプリケーションプログラミングモデルにおける Enterprise JavaBeans (EJB) の動作について説明します。この章ではまず、EJB の役割と配信メカニズムを定義します。次に、エンティティ Beans、セッション Beans、およびメッセージ駆動 Beans の 3 つの EJB タイプについて説明し、どのような場合に使うかについて詳しく説明します。さらに、ビジネスロジックのカプセル化に EJB を使う、オブジェクト指向の iPlanet Application Server アプリケーション設計の概要についても説明します。

この章には次の節があります。



Enterprise JavaBeans の役割

iPlanet Application Server では、EJB はアプリケーションにとって重要な役割を果たします。Servlet はアプリケーションのセントラルディスパッチャとして動作し、プレゼンテーションロジックを処理します。EJB はアプリケーションの実際のデータとルールを大量に処理しますが、ユーザインタフェースサービスを表示しません。EJB を使うと、ビジネスロジック、ルール、およびオブジェクトをスケーラブルな個別のモジュールに分割できます。各 EJB は、データ構造体やオペレーションメソッドなどの 1 つまたは複数のアプリケーションタスク、またはアプリケーションオブジェクトをカプセル化します。EJB はパラメータを受け取って戻り値を返します。

EJB は常にコンテナのコンテキスト内で動作します。コンテナは、EJB とそれらを管理するサーバ間のリンクとして機能します。iPlanet Application Server ソフトウェア環境では EJB コンテナがサポートされています。このコンテナは、Sun の EJB 仕様書に規定されているすべての標準コンテナサービスに加え、iPlanet Application Server に限定されたサービスも提供します。

コンテナはリモートアクセス、セキュリティ、同時性、トランザクションコントロール、およびデータベースアクセスを処理します。実際の実装方法の詳細はコンテナに含まれており、コンテナと EJB の間には規定の標準インタフェースが存在するので、Bean 開発者がプラットフォーム固有の実装に関する詳細を理解したり、処理したりする必要はありません。Bean 開発者は、EJB 標準をサポートするベンダーの製品とともに使用できる、一般的なタスク限定の EJB を作成できます。



Enterprise JavaBeans とは



EJB のアーキテクチャは、オブジェクト指向の分散型エンタープライズアプリケーションの開発および配置を行うコンポーネントベースのモデルです。EJB はアプリケーション内の一つのコンポーネントです。EJB を使って作成されたアプリケーションはスケーラブルであり、トランザクションをカプセル化し、安全なマルチユーザアクセスを許可します。これらのアプリケーションを一度作成すると、EJB をサポートする任意のサーバに配置できます。

EJB の基本的な特性は次のとおりです。

  • Bean の作成および管理は、iPlanet Application Server で提供されるコンテナによって実行時に処理されます。

  • クライアントアクセスの仲介は Bean が配置されたコンテナおよびサーバによって処理されるので、Bean 開発者がそれを処理する必要はありません。

  • EJB 仕様書で定義されている標準コンテナサービスを使うように Bean を制限すると、Bean は移植可能になり、EJB 互換コンテナに配置できます。

  • ほかの個別の Bean 要素で構成されるアプリケーション (「複合」アプリケーション) に Bean を入れたり、Bean を追加したりしても、ソースコードの変更や Bean の再コンパイルを行う必要はありません。

  • クライアントの Bean 定義ビューは、Bean 開発者によって完全に制御されます。ビューは、Bean が動作するコンテナや Bean が配置されたサーバの影響を受けません。

  • EJB は iPlanet Application Server の動作中にダイナミックに再読み込みされます。

さらに EJB 仕様書には、Enterprise JavaBeans によってクライアント、コンポーネント、および JAR ファイルの 3 つの規約が確立されることが記載されています。


クライアント規約を理解する

クライアント規約によって、クライアントと EJB コンテナ間の通信ルールが決定し、EJB を使う統一されたアプリケーション開発モデルが確立され、Bean の優れた再利用性が保証されます。クライアント規約には、EJB オブジェクトの識別方法、そのメソッドの起動方法、EJB オブジェクトの作成および破棄方法が明記されています。

EJB コンテナによって、ユーザ独自のコンポーネントやほかの供給元に提供されたコンポーネントを使った分散アプリケーションを構築できます。iPlanet Application Server には高レベルのトランザクション、ステート管理、マルチスレッド、およびリソースプールラッパーが備わっているので、ユーザが低レベル API の詳細を理解する必要はありません。

EJB インスタンスの作成および管理はコンテナクラスによって実行時に行われますが、EJB 自体は環境プロパティを編集することによって配置時にカスタマイズされます。トランザクションモードやセキュリティ属性などのメタデータは Bean 自体から切り離され、設計および配置時にコンテナのツールによって制御されます。実行時のクライアントによる Bean へのアクセスは、EJB が配置されたサーバによってコンテナ制御されます。

さらに、EJB コンテナは、EJB を定義する特定のビジネスメソッドをクライアントが確実に起動できるようにする役割を果たします。Bean 開発者は、Bean にメソッドを実装するときに、クライアントが Bean メソッドを呼び出す方法をコンテナに指示する「リモートインタフェース」をコンテナに提供する必要があります。

さらに、EJB によって「ホームインタフェース」がコンテナに提供されます。ホームインタフェースは、EJB 仕様で定義されている javax.ejb.EJBHome インタフェースを拡張します。これによって、クライアントが EJB を作成したり破棄したりするメカニズムが提供されます。ホームインタフェースは、そのもっとも基本的な機能として、Bean を作成する各方法に関連する 0 または 1 つ以上の create(...) メソッドを定義します。さらに、エンティティ Beans と呼ばれるタイプの EJB では、Bean または Bean のコレクションの検索に使う各方法についても検索メソッドを定義する必要があります。


コンポーネント規約を理解する

コンポーネント約定は EJB とそのコンテナ間の関係を確立しており、クライアントに対して完全にトランスペアレントです。特定の Bean のコンポーネント規約は、次の部分から構成されています。

  • ライフサイクル : EJB セッション Beans の場合は、javax.ejb.SessionBean および javax.ejb.SessionSynchronization インタフェースが実装されています。EJB エンティティ Beans の場合は、javax.ejb.EntityBean インタフェースが実装されています。

  • セッションコンテキスト : コンテナは javax.ejb.SessionContext インタフェースを実装して、Bean インスタンス作成時にセッション Beans インスタンスにサービスおよび情報を渡します。

  • エンティティコンテキスト : コンテナは javax.ejb.EntityContext インタフェースを実装して、Bean インスタンス作成時にエンティティ Beans にサービスおよび情報を渡します。

  • 環境 : コンテナは java.util.Properties を実装し、これらのプロパティをそのコンテナの EJB で利用できるようにします。

  • サービス情報 : コンテナは、そのコンテナのすべての EJB でそのサービスを利用できるようにします。

さらに、コンポーネント規約を拡張して、アプリケーション固有のサービスを追加できます。


JAR ファイル規約を理解する

Enterprise JavaBeans をパッケージに入れるときに使われる標準フォーマットは EJB-JAR ファイルです。このフォーマットは、Bean プロバイダとアプリケーション編成者間、およびアプリケーションの編成者と配置者間の規約です。iPlanet Application Server では、iPlanet Application Server 配置ツールを使って、EJB を含んだ .jar ファイルを作成できます。詳細については、配置ツールのオンラインヘルプを参照してください。



EJB JAR 名は、.jar拡張子ではなく、ファイル名の最初の部分によって識別されます。Application Server に配置する EJB JAR 名は、一意でなければなりません。ejb-jar.xml ファイルの <ejb-name> 部分に指定する EAR ファイル名および EJB 名には、Java パッケージ方式の命名規則を使ってください。Java パッケージ方式の命名規則を使えば、名前の衝突は発生しません。この命名規則は、iPlanet Application Server だけでなく、ほかの J2EE アプリケーションサーバでも使うことをお勧めします。



EJB-JAR ファイルは、配置記述子 (DD) だけでなく、次のクラスおよびインタフェースが使うすべてのクラスファイルを含んでいる必要があります。

  • Enterprise JavaBeans クラス

  • Enterprise JavaBeans のホームおよびリモートインタフェース

  • エンティティ Beans のプライマリキークラス

さらに、EJB-JAR ファイルは、Enterprise JavaBeans クラスと、リモートおよびホームインタフェースが使うすべてのクラスおよびインタフェースのクラスファイルを含んでいる必要があります。EJB-JAR ファイルの内容の詳細については、第 11 章「配置のためのパッケージ化」を参照してください。



Enterprise JavaBeans について



EJB は、次のいずれかを表すオブジェクトです。

  • 状態のないサービス

  • 特定のクライアントとのセッションであり、クライアントによって起動された複数のメソッドの状態を自動的に管理する

  • 複数のクライアントによって共有される可能性のあるパーシスタントエンティティオブジェクト

EJB には、エンティティ、セッション、メッセージ駆動の 3 種類があります。Bean のタイプによってサーバアプリケーションでの使用法が異なります。次の節では、3 種類の Bean について説明します。


セッション Beans について

セッション EJB には次の特性があります。

  • 1 つのクライアントに対して実行されます。

  • オプションで、プロパティの設定値に従ってトランザクション管理を処理します。

  • オプションで、基礎となるデータベース内の共有データを更新します。

  • 比較的短命です。

  • 状態のあるセッション Beans の場合、iPlanet Application Server のフェールオーバーサポートを使わないかぎりサーバクラッシュに耐える保証はありません。

セッション Beans はビジネスルールまたはビジネスロジックを実装しています。リモートアクセス、セキュリティ、同時性、およびトランザクションのすべての機能が EJB コンテナによって提供されます。セッション EJB は、そのセッション EJB を作成するクライアントだけが使うプライベートリソースです。たとえば、EJB を作成して電子ショッピングカートをシミュレートするとします。ユーザがアプリケーションにログインするたびに、アプリケーションはセッション Beans を作成してそのユーザが購入したアイテムを保持します。ユーザがログアウトしたりショッピングを終了したりすると、セッション Beans は削除されます。


エンティティ Beans について

エンティティ EJB には次の特性があります。

  • エンタープライズ情報システム (EIS) のリソース (通常はデータベース) のデータ表示

  • Bean によって管理されるトランザクション区分

  • コンテナによって管理されるトランザクション区分

  • すべてのユーザによる共有アクセス

  • データベースにデータが存在するかぎり存続する

  • EJB のサーバクラッシュを透過的に回避する

EJB および EJB コンテナを管理するサーバは、同時にアクティブになっているエンティティ EJB にスケーラブルな実行時環境を提供します。エンティティ EJB は、パーシスタントデータを表します。


メッセージ駆動 Beans について

iPlanet Application Server, Enterprise Edition 6.5 では、メッセージ駆動 Beans の配置がサポートされます。この実装は EJB 2.0 の仕様に基づいており、開発者専用です。このリリースのメッセージ駆動 Beans は、運用環境ではテストされていません。

メッセージ駆動 Beans は、Enterprise JavaBeans によって提供されるフレームワークをサポートするという点で、セッション Beans とエンティティ Beans に似ています。ただし、メッセージ駆動 Beans は JMS (Java Messaging Service) のリスナでもあり、JMS メッセージの形式でクライアントから受信するリクエストに基づいてタスクを実行します。

JMS については、付録 A 「Java Message Service の使用法」を参照してください。

セッション Beans やエンティティ Beans と異なり、メッセージ駆動 Beans はメッセージキューを非同期的に処理するので、サーバのリソースをより効率的に使用します。メッセージ駆動 Beans は多くのクライアントリクエストを同時に処理できるので、メッセージキューのボトルネックは生じません。

メッセージ駆動 Beans とセッションおよびエンティティ Beans のもっとも大きな目に見える違いは、クライアントがインタフェースを通じてメッセージ駆動 Beans にアクセスしないことです。セッションまたはエンティティ Beans と異なり、メッセージ駆動 Beans には 2 つの標準インタフェースを実装する 1 つの Bean クラスしかありません。


MDB プロパティ

メッセージ駆動 Beans には次の属性があります。

  • メッセージ駆動 Beans のインスタンスは、特定のクライアントのデータまたは会話型ステートを保持しません。

  • メッセージ駆動 Beans のすべてのインスタンスは同等であり、EJB コンテナは、どのメッセージ駆動 Beans インスタンスにもメッセージを割り当てることができます。コンテナはこれらのインスタンスをプールして、メッセージのストリームが同時に処理されるようにします。

  • 1 つのメッセージ駆動 Beans が複数のクライアントからのメッセージを処理できます。

メッセージ駆動 Beans インスタンスのインスタンス変数には、JMS API コネクション、オープンデータベースコネクション、Enterprise JavaBeans オブジェクトへのオブジェクト参照などの、クライアントメッセージの処理に関連する状態のいくつかを含めることができます。

iPlanet Application Server は、JMS 仕様を実装するメッセージングミドルウェアのアプリケーションとして、iPlanet Message Queue for Java, 2.0 SP1 を使います。iPlanet Application Server でメッセージ駆動 Beans を使う前に、iMQ for Java, 2.0 SP1 をインストールしておく必要があります。

メッセージ駆動 Beans の配置については、第 7 章「メッセージ駆動 Beans の使用」を参照してください。

iMQ for Java, 2.0 SP1 は、iPlanet Application Server インストール CD に収録されています。このインストール CD がない場合は、http://www.iplanet.com/products/iplanet_message_queue/home_message_queue.html から開発者用を無償でダウンロードできます。



iPlanet Application Server アプリケーションにおける EJB の役割



EJB は、iPlanet Application Server アプリケーションのビジネスロジックおよびデータ処理の大部分を実行します。EJB は、認識されることなく背後でアプリケーションの実行を支えます。EJB は iPlanet Application Server アプリケーションの中核にありますが、ユーザがその存在を意識することはほとんどなく、EJB と直接対話することもありません。

ユーザがブラウザから iPlanet Application Server のアプリケーション Servlet を起動すると、Servlet は 1 つまたは複数の EJB を起動してアプリケーションのビジネスロジックおよびデータ処理の大部分を行います。たとえば、Servlet はユーザのブラウザに JavaServer Page (JSP) を読み込んでユーザ名およびパスワードを要求し、さらにその内容をセッション Beans に渡して確認します。



有効なユーザ名およびパスワードの組み合わせを受け取ると、Servlet は 1 つまたは複数のエンティティ Beans およびセッション Beans をインスタンス化してアプリケーションのビジネスロジックを実行し、その後、終了します。Bean 自体もほかのエンティティ Beans またはセッション Beans をインスタンス化して、ビジネスロジックおよびデータ処理をさらに行います。

たとえば、カスタマサービス代理店による部品データベースへのアクセスを可能にするエンティティ Beans を、Servlet が起動するとします。部品データベースへのアクセスとは、データベースを検索し、顧客が購入するアイテムをキューに入れ、顧客の注文を出してデータベースの部品在庫数を減らし、顧客に請求書を発送するまでの一連のプロセスです。また、在庫が不足した場合に部品を追加注文する処理も含まれます。

顧客注文プロセスの一環として、Servlet は「ショッピングカート」を表すセッション Beans を作成し、顧客から注文を受けた製品を一時的に記録します。注文が終了すると、ショッピングカートのデータが注文データベースに転送され、在庫データベースの各アイテムの数量が減り、ショッピングカートのセッション Beans が解放されます。

この簡単な例が示すように、EJB は Servlet によって起動され、アプリケーションのビジネスロジックおよびデータ処理の大半を処理します。エンティティ Beans は基本的に、Java Database Connectivity (JDBC) API を使ったデータアクセスの処理に使われます。セッション Beans は一時的なアプリケーションオブジェクトを提供し、個々のビジネスタスクを実行します。

EJB を使うアプリケーションを作成する際の課題は、アプリケーションを Servlet、JSP、セッション Beans、エンティティ Beans にどのように分割するかを決めることです。



オブジェクト指向アプリケーションの設計



開発者として最大の仕事は、iPlanet Application Server アプリケーションのビジネスロジックおよびデータ処理をもっとも効率的な EJB セットに分割することです。EJB を使ってオブジェクト指向の設計を行うには、エンティティ Beans のインスタンスは生存期間の長い、パーシスタントな、複数のクライアント間で共有されるものにします。一方、セッション Beans のインスタンスは生存期間の短い、1 つのクライアントだけに使われるものにします。それ以外に明確なルールはありません。したがって、次の節の説明は、アプリケーションを高速化したり、EJB をモジュール化したり、共有可能にしたり、簡単にメンテナンスしたりできるようにするための、iPlanet Application Server に限定される高度な情報です。

すべてのオブジェクト指向の開発と同様に、まず、ビジネスロジックおよびデータ処理に必要な細分レベルを決める必要があります。細分レベルにより、アプリケーションをどの程度の数に分割するかが決まります。細分レベルが高い場合 (アプリケーションを多数の狭義な EJB に分割する場合) は、サイトのさまざまなアプリケーション間で EJB の共有および再利用を促進するアプリケーションが作成されます。細分レベルが低い場合は、実行速度の速いモノリシックなアプリケーションが作成されます。



アプリケーションを中程度から多数の EJB に分割すると、アプリケーションパフォーマンスが著しく劣化し、オーバーヘッドが増加します。JavaBeans などの EJB は単なる Java オブジェクトではありません。EJB は Java オブジェクトよりも高レベルです。これらの EJB は、リモート呼び出しインタフェースセマンティック、セキュリティセマンティック、トランザクションセマンティック、およびプロパティから構成されるコンポーネントです。




ガイドラインの計画

一般に、複数のアプリケーションおよびクライアント間で EJB を共有して複数のサーバ間に配置するニーズと実行速度のニーズのバランスをとるように iPlanet Application Server アプリケーションを作成します。

  • EJB をプレゼンテーションロジック (Servlet および JSP) とともに同じサーバ上に配置するようにサーバ管理者に依頼して、アプリケーション実行時のリモートプロシージャコール (RPC) の数を減らします。

  • 状態のあるセッション Beans ではなく、できるだけ状態のないセッション Beans を作成します。状態のあるセッション Beans を作成する必要がある場合は、パフォーマンスを向上させるために「スティッキーロードバランス」をオンにするようにサーバ管理者に依頼します。

  • タスク限定の小さな一般セッション EJB を作成します。これらの EJB は、多数のアプリケーションで使われる動作をカプセル化すると理想的です。

これらの一般的な注意事項に加えて、アプリケーションのどの部分がエンティティ Beans およびセッション Beans となるか決めます。


セッション Beans の使用法

セッション Beans は、1 つのデータベースレコードの更新、編集するドキュメントのコピーの更新、またはショッピングカートのように個々のクライアントに固有のビジネスオブジェクトの更新など、一時的なオブジェクトおよび処理を表します。これらのオブジェクトの利用は 1 つのクライアントに限られます。このため、セッション Beans は「会話型ステート」と呼ばれるクライアント固有のセッション情報を維持できます。会話型ステートを維持するセッション Beans は状態のあるセッション Beans と呼ばれ、会話型ステートを維持しないセッション Beans は状態のないセッション Beans と呼ばれます。

クライアントによるセッションオブジェクトの利用が終了すると、そのオブジェクトは解放されます。アプリケーションを設計するとき、一時的な 1 つのクライアントオブジェクトを潜在的なセッション Beans として指定します。たとえば、オンラインショッピングのアプリケーションでは、各ショッピングカートは一時オブジェクトです。カートの生存期間は、顧客が購入するアイテムを選択している間に限られます。顧客の買い物が終了し注文が処理されると、カートオブジェクトは不要になるため解放されます。

エンティティ Beans と同様に、セッション Beans は JDBC 呼び出しを介してデータベースにアクセスします。また、セッション Beans はトランザクション設定も提供できます。これらのトランザクション設定および JDBC 呼び出しは、セッション Beans のコンテナによって参照されます。このコンテナは透過的です。iPlanet Application Server によって提供されるコンテナは、JDBC 呼び出しおよびリザルトセットを処理します。

iPlanet Application Server アプリケーションで、セッション Beans を使って単一のクライアントアクセス用に一時オブジェクトおよびルールを定義する方法の詳細については、第 5 章「セッション EJB によるビジネスルール管理」を参照してください。


エンティティ Beans の使用法

エンティティ Beans は通常、パーシスタントデータを表します。このデータは、データベースで直接管理されます。すなわち、オブジェクトとしての EIS アプリケーションからアクセスされます。エンティティ Beans の簡単な例としては、データベーステーブルの 1 行を表すように定義され、各 Bean インスタンスが特定の行を表すものがあります。より複雑な例としては、データベース内の複雑に組み合わされたテーブルを表すように設計され、各 Bean インスタンスが 1 つのショッピングカートの内容を表すエンティティ Beans があります。

セッション Beans とは異なり、エンティティ Beans のインスタンスには、複数のクライアントが同時にアクセスできます。コンテナは、使用するトランザクションごとにインスタンスのステートの同期をとる役割を果たします。この役割がコンテナに委譲された場合、Bean 開発者は複数のトランザクションからメソッドへの同時アクセスを考慮せずにすみます。

エンティティ Beans のパーシスタンスは、Bean またはコンテナによって管理できます。パーシスタンスがエンティティ Beans によって管理されると、「Bean 管理パーシスタンス」と呼ばれます。Bean がこの機能をコンテナに委譲した場合は、「コンテナ管理パーシスタンス」 (CMP) と呼ばれます。

  • Bean 管理パーシスタンス : Bean 開発者が EJB クラスメソッドにパーシスタンスコード (JDBC 呼び出しなど) を直接実装します。専用インタフェースを使うと、ダウンサイドでは移植性が失われる可能性があり、Bean が特定のデータベースに関連付けられるというリスクがあります。

  • コンテナ管理パーシスタンス : コンテナプロバイダ配置ツールを使ってコンテナパーシスタンスを実装します。コンテナは透過的にパーシスタンスステートを管理します。したがって、ユーザが Bean メソッドのデータアクセスコードを実装する必要はありません。この方法によって、簡単に実装できるだけでなく、特定のデータベースに関連付けずに完全に Bean を移植できます。

エンティティ Beans を使って、iPlanet Application Server アプリケーションでパーシスタントオブジェクトおよびビジネスロジックを定義する方法の詳細については、第 6 章「エンティティ EJB のビルド」を参照してください。


フェールオーバーリカバリ計画

フェールオーバーリカバリは、サーバのクラッシュ後に Bean がそれ自体をインスタンス化し直すプロセスです。フェールオーバーリカバリは、状態のないセッション Beans と状態のあるセッション Beans の両方でサポートされます。セッション Beans のフェールオーバープロパティの設定には配置ツールを使います。これらの設定値の詳細については、配置ツールのオンラインヘルプを参照してください。セッション Beans のフェールオーバーリカバリの詳細については、第 5 章「セッション EJB によるビジネスルール管理」を参照してください。

エンティティ Beans は、サーバクラッシュ後に Bean 参照が失われたという警告を表示するフェールオーバーリカバリをサポートしています。エンティティ Beans を復元するには、ファインダを使って Bean の新規参照を作成する必要があります。詳細については、「ファインダーメソッドの使用法」を参照してください。


データベース操作

iPlanet Application Server では、トランザクション属性とともに JDBC API を使ってデータベース操作を行うことをお勧めします。データベースコネクションを確立するには、JNDI (Java Naming and Directory Interface) を使います。JNDI は、アプリケーションが JDBC ドライバから独立してデータベースサービスを検索して、アクセスする標準的な手段を提供します。

エンティティ Beans を使って iPlanet Application Server アプリケーションでパーシスタントオブジェクトおよびビジネスロジックを定義する方法の詳細については、第 9 章「JDBC を使ったデータベースアクセス」を参照してください。

セッションおよびエンティティ Beans を介して利用できるトランザクションコントロールの詳細については、第 8 章「EJB のトランザクション処理」を参照してください。


EJB の配置

Deployment Tool を使って、アプリケーションの残りの部分と共に EJB を配置します。詳細については、配置ツールのオンライン ヘルプを参照してください。配置ツールによって設定されるプロパティ設定値や、それらのアプリケーションへの影響の詳細については、第 11 章「配置のためのパッケージ化」を参照してください。


EJB のダイナミックな再読み込み

iPlanet Application Server での EJB の再読み込みは、サーバを再起動しなくても、EJB を配置し直すだけで行うことができます。同じディレクトリ内で新しい EJB 実装のクラスファイルに置き換えても行うことができます。

iPlanet Application Server は、新しいコンポーネントを検出し、次の EJB 呼び出しの作成時に再読み込みします。



  • EJB の再読み込みは、EJB 実装クラスにだけ適用されます。

  • 出荷時、ダイナミックな再読み込み機能はデフォルトでオフになっています。必要に応じてオンにしてください。



詳細については、付録 B 「実行時の注意事項」を参照してください。



ejbc コンパイラの使用法



iPlanet Application Server には、次の機能を持つ ejbc ユーティリティがあります。

  • すべての EJB クラスおよびインタフェースを調べて、EJB 仕様書に準拠しているかどうかを確認する

  • スタブおよびスケルトンを生成する

スタブとスケルトンは EJB コンテナに必要で、アプリケーションファイルとともに配置する必要があります。これらのスタブとスケルトンによってリモート通信が可能になり、コンテナはすべての Bean リクエストを捕捉できます。

ejbc ユーティリティは、次のファイルを生成します。


表 4-1    ejbc ユーティリティによって生成されるファイル

ファイル

説明

必要な ejbc オプション

_Home_Stub.class  

OMG JavaIDL 07-59-99 仕様書準拠のホームスタブクラス  

-iiop  

_Remote_Stub.class  

OMG JavaIDL 07-59-99 仕様書準拠のリモートスタブクラス  

-iiop  

_ejb_RmiCorbaBridge_Home_Tie.class  

ホームインタフェースタイクラス  

-iiop  

_ejb_RmiCorbaBridge_Remote_Tie.class  

OMG JavaIDL 07-59-99 仕様書準拠のタイクラス  

-iiop  

ejb_RmiCorbaBridge_Remote.class  

リモートインタフェースブリッジ  

-iiop  

ejb_RmiCorbaBridge_Home.class  

ホームブリッジ  

-iiop  

ejb_fac_Implementation.class  

ホームファクトリ  

 

ejb_home_Implementation.class  

ホームスケルトン  

 

ejb_kcp_skel_Remote.class  

KCP リモートスケルトン  

 

ejb_kcp_skel_Home.class  

KCP ホームスケルトン  

 

ejb_kcp_stub_Remote.class  

KCP リモートスタブ  

 

ejb_kcp_stub_Home.class  

KCP ホームスタブ  

 

ejb_skel_Implementation.class  

リモートスケルトン  

 

ejb_stub_Remote.class  

リモートスタブ  

 

ejb_stub_Home.class  

ホームスタブ  

 

通常使う ejbc のシンタックスは次のとおりです。

ejbc options Home Remote Implementation

RMIC (Remote Method Invocation Compiler) モードでは、IIOP スタブとスケルトンクラスだけが生成され、EJB 仕様書に対する準拠の確認は省略されます。RMIC モード用の ejbc のシンタックスは次のとおりです。

ejbc options -rmic Remote

オプションは次のとおりです。-sl-sf、または -cmp が指定されていない場合、Bean は BMP エンティティ Beans としてコンパイルされます。


表 4-2    ejbc のオプション

オプション

説明

-sl  

Bean を状態のないセッション Beans としてコンパイルする  

-sf  

Bean を状態のあるセッション Beans としてコンパイルする  

-fo  

可用性の高い状態のあるセッション Beans をコンパイルする  

-cmp  

Bean を CMP エンティティ Beans としてコンパイルする  

-iiop  

追加の CORBA クラスを生成する  

-gs  

Java ソースファイルを生成する  

-d dir  

出力ディレクトリを指定する  

-help  

シンタックスの要約を表示する  

-rmic  

RMIC コードを生成する  

-classpath classpath  

クラスパスを設定する  

-cp  

廃止。代わりに -classpath を使用  

-javaccp classpath  

javac クラスパスに接頭辞を追加する  

-debug  

ejbc ユーティリティをデバッグモードで実行し、デバッグ情報を出力する  



JNDI による EJB の参照



ここでは、EJB を検索するための JNDI の命名方式の例 (サーバに添付の HelloWorld サンプルの型に準拠) を示します。Servlet のソースファイル GreeterServlet.java は、TheGreeter Bean のホームを検索します。



ここで説明する原則は、EJB 間の EJB 検索にも適用できます。



GreeterServlet.java ファイルの JNDI 検索は次のようになります。

initContext = new javax.naming.InitialContext();
String JNDIName = "java:comp/env/
ejb/greeter";
Object objref = initContext.lookup(JNDIName);
GreeterHome myGreeterHome =
   (GreeterHome)PortableRemoteObject.narrow(objref,
   GreeterHome.class);



iPlanet では、EJB へのすべての参照をアプリケーションコンポーネントの環境の ejb サブコンテキストで構成することをお勧めします (たとえば、java:comp/env/ejb サブコンテキスト)。



参照コンポーネントの web.xml ファイルの ejb-ref エントリは次のようになります。

<ejb-ref>
   <ejb-ref-name>
ejb/greeter</ejb-ref-name>
   <ejb-ref-type>Session</ejb-ref-type>
   <home>samples.helloworld.ejb.GreeterHome</home>
   <remote>samples.helloworld.ejb.Greeter</remote>
   <ejb-link>
TheGreeter</ejb-link>
</ejb-ref>

JNDI の命名では、web.xml の 2 つの属性が重要です。

  • ejb-ref-name 属性は、ソースファイルで使う検索文字列を定義します。

  • ejb-link 属性は、この参照をターゲット Enterprise JavaBeans に接続します。これは、ターゲット Enterprise JavaBeans の ejb-jar.xml ファイルの ejb-name 属性で定義されている名前です。

J2EE 仕様書によると、ターゲット Bean は同じ J2EE アプリケーションにある EJB JAR モジュールの一部でなければなりません。

アプリケーションが配置されると、参照は次の場所にあるレジストリ (LDAP 内) に保存されます。

SOFTWARE¥iPlanet¥Application Server¥6.5¥J2EE-Module¥module_name¥ejb-refs

図 4-1 は、レジストリエントリを示しています。

図 4-1    EJB 参照のレジストリエントリ



参照コンポーネントの ias-web.xml ファイルの ejb-ref エントリは次のようになります。

<ejb-ref>
   <ejb-ref-name>ejb/greeter</ejb-ref-name>
   <jndi-name>ejb/
TheGreeter</jndi-name>
</ejb-ref>

iPlanet 固有の配置記述子 ias-web.xmlejb-ref セクションでは、検索名 (web.xmlejb-ref-name 属性と同じ) はターゲット Enterprise JavaBeans の JNDI 名に接続されます。Bean の JNDI 名は ejb/bean_name です。たとえば、Bean 名 (ターゲット Bean の ejb-jar.xml ファイルの ejb-name 属性によって定義される) が TheGreeter の場合、配置される Bean の JNDI 名は ejb/TheGreeter です。

さらに、ターゲット Enterprise JavaBeans の ejb-jar.xml ファイルは次のようになります。

<ejb-jar>
   <enterprise-beans>
   <session>
       <display-name>TheGreeter</display-name>
       <ejb-name>
TheGreeter</ejb-name>
       <home>samples.helloworld.ejb.GreeterHome</home>
       <remote>samples.helloworld.ejb.Greeter</remote>
       <ejb-class>samples.helloworld.ejb.GreeterEJB</ejb-class>
       <session-type>Stateless</session-type>
       <transaction-type>Bean</transaction-type>
   </session>
   ...
</ejb-jar>

ターゲット Enterprise JavaBeans (ejb-name 属性) の配置記述子は、web.xml ファイルの ejb-link 属性、および参照コンポーネントの JNDI 名 (ias-web.xmljndi-name) と同じです。また、参照コンポーネントとターゲット Bean の配置記述子の Bean タイプ、ホームおよびリモートインタフェースも同じです。

web.xmlias-web.xml、および ejb-jar.xml の各ファイルの詳細については、第 11 章「配置のためのパッケージ化」を参照してください。

EJB が配置されると、すべての Bean 検索はレジストリの次のセクションに保存されます。

SOFTWARE¥iPlanet¥Application Server¥6.5¥EJB-Components

図 4-2 は、レジストリエントリを示しています。

図 4-2    EJB コンポーネントのレジストリエントリ




前へ     目次     索引     DocHome     次へ     
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.

最新更新日 2002 年 3 月 6 日