この章では、Enterprise JavaBeansについて説明します。
この章の内容は以下のとおりです。
Enterprise JavaBeans (EJB) 3.1テクノロジは、コンポーネントベースのビジネス・アプリケーションの開発とデプロイメントで使用するサーバー側のコンポーネント・アーキテクチャです。EJBテクノロジを使用することで、Java EE 6テクノロジに基づいて、安全でポータブルな分散トランザクション・アプリケーションを迅速かつ容易に開発できます。
EJB 3.1の仕様では、プログラミングおよびパッケージ化モデルの変更が簡素化されています。前のバージョンのJavaインタフェースを使用する必要がなくなり、プレーンな従来型Javaオブジェクトに注釈付けし、EJBコンポーネントとして使用できるようになりました。EJBモジュールをWebアプリケーションの内部に直接配置できるようになり、簡素化はさらに進みました。これにより、WebコンポーネントおよびEJBコンポーネントを格納するアーカイブを作成して、それらをEARファイルに結合する必要はなくなりました。
WebLogic ServerでEJBを使用する方法については、次を参照してください。
EJB 3.1の新機能については、『Oracle WebLogic Server の新機能』のEnterprise Java Beans (EJB)に関する項を参照してください。
WebLogic Serverでの3.1 EJBのプログラミング、パッケージ化およびデプロイについては、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』を参照してください。
分割ディレクトリ環境でのWebLogic Server EJBの整理および構築については、『Oracle WebLogic Serverアプリケーションの開発』を参照してください。
2.x EJBのプログラミングとパッケージ化については、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1のプログラミング』を参照してください。
エンタープライズBeanの利点、エンタープライズBeanの種類、ライフサイクルなどのEJBの概念についての補足情報は、次のWebサイトを参照してください。
Enterprise JavaBeans 3.1仕様(JSR-318)(http://jcp.org/en/jsr/summary?id=318
)
Java EE 6チュートリアル(http://download.oracle.com/javaee/6/tutorial/doc/bnblr.html
)の「エンタープライズBeans」の章
Java EE 6プラットフォームの概要: パート3 (EJB Technology, Even Easier to Use)(http://www.oracle.com/technetwork/articles/javaee/javaee6overview-part3-139660.html#ejbeasy
)
セッションBeanは、ビジネス・ロジックを実装します。セッションBeanインスタンスは、一度に1つのクライアントにサービスを提供します。セッションBeanには、ステートフル、ステートレス、およびシングルトンの3種類があります。
セッションBeanの種類およびそれらを使用するタイミングの詳細は、Java EE 6チュートリアル(http://download.oracle.com/javaee/6/tutorial/doc/gipjg.html
)の「エンタープライズBeans」の章のセッションBeanの内容に関する項を参照してください。
ステートフル・セッションBeanは、特定のクライアントとの対話を反映する状態情報をメソッドやトランザクションをまたがって維持します。ステートフル・セッションBeanは、クライアントと他のエンタープライズBeanの対話を管理するか、ワークフローを管理できます。
例: 社員が個人のプロファイル情報を表示して更新できる、ある会社のWebサイトでは、ステートフル・セッションBeanを使用して様々な他のBeanを呼び出し、ユーザーがページ上で「データの表示」をクリックした後に以下のようなユーザーが必要とするサービスを提供できます。
JSPからログイン・データを受け付け、そのログイン・データを検証する別のEJBを呼び出す
認可の確認をJSPに送信する
認可されたユーザーのプロファイル情報にアクセスするBeanを呼び出す
ステートレス・セッションBeanは、呼出し間でセッションやクライアントの状態の情報を格納しません。唯一格納されることのある状態はクライアントに固有のものではなく、キャッシュされたデータベース接続や別のEJBの参照などです。ステートレス・セッションBeanが状態を格納できるのは、長くてメソッド呼出しの期間だけです。メソッドが完了すると、状態情報は維持されません。
ステートレス・セッションBeanのインスタンスはすべて、任意のクライアントにサービスを提供できます - どのインスタンスも同等です。ステートレス・セッションBeanは、ステートフル・セッションBeanよりもパフォーマンスが優れています。その理由は、各ステートレス・セッションBeanが複数のクライアントをサポートできるからです(ただし一度に1つ)。ステートレス・セッションBeanのクライアントは、Webサービス・エンドポイントにできます。
例: 訪問者が問合せ先リンクをクリックして電子メール送信できるインターネット・アプリケーションでは、ステートレス・セッションBeanを使用して、JSPによってユーザーから収集された送信先と送信元の情報に基づいて電子メールを生成できます。
シングルトン・セッションBeanが提供する正式なプログラミング構成により、特定のJava仮想マシン(JVM)内のアプリケーションごとにセッションBeanがインスタンス化され、そのアプリケーションのライフサイクルに存在することが保証されます。シングルトンにより、エンタープライズBeanコンポーネントの複数のインスタンス間、またはアプリケーション内の複数のエンタープライズBeanコンポーネント間で、容易に状態を共有することができます。
シングルトン・セッションBeanはステートレス・セッションBeanと同様の機能を提供します。ただし、ステートレス・セッションBeanではそのプールでクライアント要求に応答するのに対して、シングルトン・セッションBeanはアプリケーションごとに1つしかありません。シングルトン・セッションBeanは、ステートレス・セッションBeanと同様に、Webサービス・エンドポイントを実装できます。シングルトン・セッションBeanではクライアントの呼出し間でその状態を保持しますが、サーバーのクラッシュまたは停止時にはその状態を保持する必要はありません。
例: 中央カウンタ・サービスを提供するインターネット・アプリケーション。ステートレス・シングルトンBeanは、Javaクライアントからコールされ、クライアントが複数回呼び出されると、カウントがそのたびに1ずつインクリメントされます。
メッセージドリブンBeanは、リクエストに対するレスポンスが即時である必要のない疎結合(非同期)のビジネス・ロジックを実装します。メッセージドリブンBeanは、JMSキューまたトピックからメッセージを受信し、そのメッセージの内容に基づいてビジネス・ロジックを実行します。それは、EJBとJMSの間の非同期インタフェースです。
MDBインスタンスはそのライフサイクルを通じて、同時にではありませんが複数のクライアントからのメッセージを処理できます。特定のクライアントの状態は維持されません。メッセージドリブンBeanのインスタンスはすべて同じ機能であり、EJBコンテナはどのMDBインスタンスにもメッセージを割り当てることができます。コンテナは、それらのインスタンスをプールしてメッセージのストリームの並行処理を可能にします。
EJBコンテナは、必要に応じてBeanのインスタンスを作成し、JMSメッセージをインスタンスに渡すことによってメッセージドリブンBeanと直接対話します。コンテナは、デプロイメント時にBeanのインスタンスを作成し、メッセージのトラフィックに基づいて作動時にインスタンスを追加および削除します。
詳細は、『Oracle WebLogic ServerメッセージドリブンBeanのプログラミング』を参照してください。
例:顧客から注文を受けるプロセスがサプライヤへの発注プロセスを引き起こすオンライン・ショッピング・アプリケーションでは、サプライヤへの発注プロセスをメッセージドリブンBeanで実装できます。顧客の注文が必ずサプライヤへの発注につながる一方で、そのステップは疎結合になります。その理由は、顧客の注文を確定する前にサプライヤへの発注を生成する必要はないからです。関連するサプライヤへの注文が発行される前に顧客の注文が「蓄積」されるのは問題なく、有益なことです。
以下の節では、各Beanタイプで必須のクラス、EJB実行時環境、およびBeanの実行時の動作を管理するデプロイメント記述子ファイルについて簡単に説明します。
Beanの構造はBeanタイプによって異なります。表12-1では、各タイプのEJBを構成するクラスと、そのクラス・タイプの用途を定義しています。
注意: EJB 2.1以前のAPIでは、ローカルおよびリモート・クライアントが、セッションBeanのローカルまたはリモート・ホームおよびローカルまたはリモート・コンポーネント・インタフェースによって、ステートフルまたはステートレス・セッションBeanにアクセスする必要がありました。これらのインタフェースはEJB 3.xでも使用し続けることができますが、EJB 2.1のリモートおよびローカル・クライアント・ビューは、シングルトン・セッションBeanではサポートされません。 詳細は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1のプログラミング』のEJBのクラスとインタフェースの作成に関する項を参照してください。 |
表12-1 EJB 3.1のコンポーネント
EJBのコンポーネント | 説明 | ステートレス・セッション | ステートフル・セッション | シングルトン・セッション | MDB |
---|---|---|---|---|---|
リモート・ビジネス・インタフェース |
リモート・ビジネス・インタフェースは、ビジネス・ロジックをリモート・クライアント(EJBとは別のアプリケーションで動作するクライアント)に公開します。リモート・クライアントから呼び出せるビジネス・メソッドを定義します。 |
はい |
はい |
はい |
いいえ |
ローカル・ビジネス・インタフェース |
ローカル・ビジネス・インタフェースは、ビジネス・ロジックをローカル・クライアント(EJBと同じアプリケーションで動作しているクライアント)に公開します。ローカル・クライアントから呼び出せるビジネス・メソッドを定義します。 |
はい |
はい |
はい |
いいえ |
ローカル・インタフェースなし |
インタフェースなしの場合、個別のビジネス・インタフェースを使用することなく、Beanクラスのパブリック・メソッドを公開する様々なローカル・ビューを表示できます。 |
はい |
はい |
はい |
はい |
Beanクラス |
Beanクラスはビジネス・ロジックを実装します。 |
はい |
はい |
はい |
はい |
EJBコンテナとは、アプリケーション・サーバーにデプロイされたBeanの実行時コンテナです。このコンテナはアプリケーション・サーバーの起動時に自動的に作成され、Beanと以下のような実行時サービスの間のインタフェースとして機能します。
ライフサイクル管理
コード生成
セキュリティ
トランザクション管理
ロックと同時実行性制御
従来のJava EEサーバーベースの実行とは異なり、組込み可能なものを使用することで、クライアント・コードとそれに対応するエンタープライズBeanを同じ仮想マシンおよびクラス・ローダー内で実行できます。これにより、テスト、オフライン処理(バッチ・ジョブなど)、およびデスクトップ・アプリケーションのEJBプログラミング・モデルの使用に対するサポートが向上します。
Java EEサーバーのエンタープライズBeanコンテナに存在するほとんどのサービスは、注入、コンテナ管理のトランザクションおよびセキュリティを含め、組込みエンタープライズBeanコンテナで使用できます。エンタープライズBeanコンポーネントは組込みでもJava EE環境でも同様に実行されるため、同じエンタープライズBeanをスタンドアロンおよびネットワーク・アプリケーションの両方で容易に再利用できます。
組込みEnterprise Beanコンテナの詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』のOracle WebLogic Serverでの組込みEJBコンテナの使用方法に関する項を参照してください。
WebLogic Server EJB 3.1プログラミング・モデルでは、Java EE 6メタデータ・アノテーション機能を使用して、アノテーション付きEJB 3.1 Beanファイルを作成します。次に、WebLogicコンパイル・ツールweblogic.appc
(またはこれと同等のAntタスクwlappc
)を使用してBeanファイルをJavaクラス・ファイルにコンパイルし、必須のEJBインタフェースやオプションのデプロイメント記述子など、関連するEJBアーティファクトを生成します。
詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』のアノテーション付きEJBクラスのプログラミングに関する項を参照してください。
EJB 3.0以降では、EJBデプロイメント記述子ファイル(ejb-jar.xml
など)を作成する必要がなくなりました。ただし、必要に応じて、引き続きXMLデプロイメント記述子を使用することはできます。競合がある場合、デプロイメント記述子の値がアノテーションの値をオーバーライドします。
EJB実装で引き続きデプロイメント記述子を使用する場合は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1のプログラミング』のEJBデプロイメント記述子に関する項を参照してください。
WebLogic ServerのEJB 2.xには、次の3つのデプロイメント記述子があります。
ejb-jar.xml
: 標準Java EEデプロイメント記述子です。Beanはすべてejb-jar.xml
で指定する必要があります。ejb-jar.xml
では、一緒にデプロイされる複数のBeanを指定できます。
weblogic-ejb-jar.xml
: クラスタリング、キャッシング、トランザクションといったWebLogic Serverの機能と関連する要素を格納するWebLogic Server固有のデプロイメント記述子。このファイルは、BeanがWebLogic Server固有の機能を利用する場合は必須です。ejb-jar.xml
と同じように、weblogic-ejb-jar.xml
では一緒にデプロイされる複数のBeanを指定できます。
weblogic-cmp-jar.xml
- エンティティBeanのコンテナ管理による永続性に関連する要素を格納するWebLogic Server固有のデプロイメント記述子。コンテナ管理による永続性を使用するエンティティBeanは、weblogic-cmp-jar.xml
ファイルに指定する必要があります。
WebLogic Server EJB 2.xデプロイメント記述子の詳細は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1のプログラミング』のデプロイメント記述子スキーマおよび文書型定義リファレンスに関する項を参照してください。
EJBは、サーブレット、Javaクライアント・アプリケーション、他のEJB、Webサービス、非Javaクライアントなどのサーバー側またはクライアント側オブジェクトからアクセスできます。EJBのクライアントは、アプリケーションが同じか別かに関係なく同じ方法でEJBにアクセスします。WebLogic Serverは、Beanにローカル・インタフェースしかない場合を除いて、リモートで機能できるEJBのホーム・インタフェースおよびビジネス・インタフェースの実装を自動的に作成します。
クライアントは、インタフェースなしのビューまたはビジネス・インタフェースを介してエンタープライズBeanにアクセスします。エンタープライズBeanのインタフェースなしのビューでは、エンタープライズBean実装クラスのパブリック・メソッドをクライアントに公開します。エンタープライズBeanのインタフェースなしのビューを使用しているクライアントは、エンタープライズBean実装クラスまたはその実装クラスの任意のスーパークラスの任意のパブリック・メソッドを呼び出すことができます。ビジネス・インタフェースは、エンタープライズBeanのビジネス・メソッドを含む標準のJavaプログラミング言語インタフェースです。
エンタープライズBeanのクライアントは、エンタープライズBeanのインスタンスへの参照を取得します。そのためには、Javaプログラミング言語のアノテーションで依存関係インジェクションを使用するか、エンタープライズBeanインスタンスを検索するJNDI構文を使用してJNDIルックアップを実行します。
エンタープライズBeanインタフェースを取得する最も簡単な方法は、依存関係インジェクションです。Java EEサーバー管理対象の環境、JavaServer Faces Webアプリケーション、JAX-RS Webサービス、その他のエンタープライズBean、またはJava EEアプリケーション・クライアントの中で実行されるクライアントは、javax.ejb.EJB
アノテーションを使用した依存関係インジェクションをサポートします。
Java SEアプリケーションなど、Java EEサーバー管理対象の環境外で実行されるアプリケーションは、明示的ルックアップを実行する必要があります。JNDIでは、Java EEコンポーネントを識別して明示的ルックアップを単純化するグローバル構文をサポートします。詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』のEJBクライアントへのアクセスのプログラミングに関する項を参照してください。
ネットワークのオーバーヘッドのため、Beanにはリモート・クライアントからアクセスするよりも同じマシン上のクライアントからアクセスする方が効率的であり、クライアントが同じアプリケーションにあればさらに効率的です。
クライアントによるEJBへのアクセスのプログラミングの詳細は、Java EE 6チュートリアル(http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html
)の「エンタープライズBean」のエンタープライズBeanへのアクセスに関する項を参照してください。
WebLogic Server EJBは、以下のプロトコルを使用します。
T3 - リモート・オブジェクトとの通信に使用します。T3は、Remote Method Invocation (RMI)プロトコルを実装するWebLogic独自のリモート・ネットワーク・プロトコルです。
RMI - リモート・オブジェクトとの通信に使用します。RMIを使用すると、アプリケーションはネットワークの他のどこかにあるオブジェクトの参照を取得し、同じJVMでクライアントと共存しているかのようにそのオブジェクトのメソッドをクライアントの仮想マシンからローカルで呼び出すことができます。
リモート・インタフェースのあるEJBはRMIオブジェクトです。EJBのリモート・インタフェースは、java.rmi.remote
を拡張します。WebLogic RMIの詳細は、『Oracle WebLogic Server RMIのプログラミング』を参照してください。
HTTP - EJBは、java.net.URL
リソース接続ファクトリを使用してWebLogic Server環境外のWebサーバーとのHTTP接続を取得できます。詳細は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1のプログラミング』のURLにリクエストを送信するためのEJBの構成に関する項を参照してください。
EJBが使用するネットワーク接続の属性は、EJBをWebLogic Serverカスタム・ネットワーク・チャネルにバインドすることによって指定できます。詳細は、『Oracle WebLogic Serverサーバー環境の構成』のネットワーク・リソースの構成に関する項を参照してください。
デフォルトでは、EJBのパブリック・メソッドはどのユーザーでも呼び出すことができます。EJBへのアクセスを制限するには、セキュリティ・アノテーションを使用して、ロールによってメソッドの呼び出せる範囲(すべてのメソッドかメソッドのサブセットか)を指定できます。詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』のEJBのアクセス・セキュリティに関する項を参照してください。
また、セキュリティ・ロールを作成し、ロールにユーザーをマッピングするには、WebLogic Server管理コンソールでセキュリティ・レルムを更新します。詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのセキュリティ・ロールの管理に関する項を参照してください。
セキュリティとEJBの詳細は、以下を参照してください。
『Oracle WebLogic Serverセキュリティの理解』のセキュリティの基礎に関する項に、認証、認可など、セキュリティ関連の基礎的な情報があります。
EJBの認証と認可を構成する手順については、『Oracle WebLogic Serverセキュリティのプログラミング』のEnterprise JavaBeans (EJB)のセキュリティ対策に関する項を参照してください。
『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』に、管理コンソールを使用してEJBの認証と認可を構成する手順が含まれています。
表12-2 WebLogic ServerでのEJBのためのロードマップ
主要なタスク | サブタスクと追加情報 |
---|---|
EJB 3.1について |
|
単純なEJBサンプル |
|
反復的EJB開発 |
|
アノテーション付きEJBクラスのプログラミング |
|
EJBデプロイメントのガイドライン |
|
Oracle WebLogic Serverでの組込みEJBコンテナの使用方法 |
|
Oracle WebLogic Serverでの永続性プロバイダの構成 |
|
リファレンス |
|
Oracle WebLogic ServerでのOracle Kodoの使用方法 注: Oracle TopLink (JPA 2.0永続性プロバイダ)は、前のリリースのデフォルト・プロバイダのKodoに取ってかわり、現在デフォルトのJPAプロバイダになっています。詳細は、「Oracle WebLogic Serverでの永続性プロバイダの構成」を参照してください。 |
|
EJB 2.xについて |
|