EJB には、分散型でコンポーネントベースのアプリケーションを作成するためのコンポーネントアーキテクチャがあります。これは、J2EE (Java 2 Enterprise Edition) アーキテクチャの重要な部分であり、EJB 仕様の機能だけを使用して書かれた EJB は、いずれの J2EE アプリケーションサーバでも使用できます。
「エンタープライズ」は、この略語の中で重要な言葉です。EJB はエンタープライズレベルのアプリケーション用アーキテクチャであり、EJB プログラミングモデルは、EJB API (Application Programming Interface:アプリケーションプログラミングインターフェイス) を理解している経験豊富なサーバサイド Java 開発者に最も適しています。ただし、EJB 仕様に対応するには、アプリケーションサーバがさまざまな EJB コンテナサービスを提供する必要があります。これらのサービスを使用することにより、ビジネスロジックの開発に専念できます。さらに JRun では、スタブレスオープンディレクトリデプロイ、エンタープライズデプロイウィザード、XDoclet サポートなどの機能を提供して、EJB 開発処理が簡素化されています。
EJB の使用については、弟 14 章、「EJB プログラミングテクニック」を参照してください。
EJB クライアントは次のようにリモートアクセスとローカルアクセスを使用できます。
アプリケーションデプロイ担当者は、クライアントがアクセスするすべての EJB のためのコンパイル済みインターフェイスが、クライアントのクラスパスに含まれていることを確認する必要があります。
メモ: 元の EJB 仕様では、クライアントが bean とそのメソッドにアクセスするのに、リモートメソッド呼び出し (RMI) を使用する必要がありました。EJB の優れた使用方法が整備されるにつれて、EJB クライアントと EJB コンテナを同じアプリケーションサーバのインスタンスに配置する方法でパフォーマンスを最適化するデザインパターンが現れました。しかし、このようなクライアントはやはり RMI のオーバーヘッドに制約されたため、多くのアプリケーションサーバが、同じ場所に配置されたクライアントを最適化するオプションを提供しました。最新の EJB 仕様では、アプリケーションサーバは、ローカルとリモートの両方のインターフェイスをサポートする必要があります。
リモート EJB はクライアントのさまざまな JVM で実行されます。EJB がリモートで実行されることによって、ネットワークの任意の場所に配置されたクライアントからアクセスできます。
次のように bean のリモートインターフェイスを定義することによって、リモート能力を有効化できます。
javax.ejb.EJBLocalHome
を拡張します。
... public interface SimpleHome extends EJBHome { // リモートインターフェイスが返されます。 public Simple create() throws RemoteException, CreateException; } ...
javax.ejb.EJBObject
を拡張します。... public interface Simple extends EJBObject { public String getMessage() throws RemoteException; } ...
java.rmi.RemoteException
を返す必要があります。
次の例に示すように、ejb-jar.xml ファイルで EJB を定義する場合は、remote
要素とremote-home
要素も入れる必要があります。
...
<session> <display-name>Simple</display-name> <ejb-name>Simple</ejb-name> <home>SimpleHome</home> <remote>Simple</remote> <ejb-class>SimpleBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> ...
リモートとローカルの EJB クライアントのコーディングの詳細については、弟 14 章、「EJB プログラミングテクニック」を参照してください。
ローカル EJB はクライアントと同じサーバで実行されます。ローカルで実行されることにより、EJB が RMI 呼び出しのオーバーヘッドを回避します。
典型的なシナリオは、1 つ以上のローカルエンティティ bean に対してクライアントとして動作するステートレスセッション bean に関係があります。
次のように、bean のローカルインターフェイスを定義することによって、ローカル能力を有効化できます。
javax.ejb.EJBLocalHome
を拡張します。
... public interface SimpleLocalHome extends EJBLocalHome { public SimpleLocal create() throws CreateException; } ...
javax.ejb.EJBLocalObject
を拡張します。... public interface SimpleLocal extends EJBLocalObject { public String getMessage(); } ...
java.rmi.RemoteException
を返しません。EJB のためにリモートインターフェイスとローカルインターフェイスを実装できますが、これは一般的ではありません。
次の例に示すように、ejb-jar.xml ファイルで EJB を定義する場合は、local
要素と local-home
要素も入れる必要があります。
...
<session> <display-name>SimpleLocal</display-name> <ejb-name>SimpleLocal</ejb-name> <local-home>SimpleLocalHome</local-home> <local>SimpleLocal</local> <ejb-class>SimpleLocalBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> ...
リモートとローカルの EJB クライアントのコーディングの詳細については、弟 14 章、「EJB プログラミングテクニック」を参照してください。
EJB デプロイメントディスクリプタは XML 形式のテキストファイルで、1 つ以上の EJB に必要なコンポーネント、機能、サービスを定義する要素が含まれます。多くの開発者は、テキストエディタを使用して手作業でコーディングすることによって、デプロイメントディスクリプタを管理しています。さらに、JRun では、エンタープライズデプロイウィザードと XDoclet サポートが提供され、デプロイメントディスクリプタ要素を自動的に生成できます。次の例に示すように、EJB デプロイメントディスクリプタには ejb-jar.xml という名前を付け、インターフェイスと bean の実装に関連付けられている META-INF ディレクトリに保管する必要があります。
詳細については、弟 14 章、「EJB プログラミングテクニック」を参照してください。JRun 特有のデプロイメントディスクリプタを使用して、JRun 特有の機能を実装することもできます。詳細については、第 14 章および『JRun アセンブルとデプロイガイド』を参照してください。