12 Enterprise JavaBeans (EJB)

Enterprise JavaBeans (EJB)は、EJBテクノロジを実装するJava EEコンポーネントです。EJBは、Oracle WebLogic Server内のランタイム環境であるEJBコンテナで実行されます。EJBコンテナは、トランザクションやセキュリティなどのシステム・レベルのサービスを、アプリケーション開発者には意識させることなく、その中にデプロイされているEJBに提供します。これらのサービスを使用すると、トランザクション対応のJava EEアプリケーションのコアを形成するEJBを迅速に構築してデプロイできます。

この章の内容は次のとおりです。

EJBの理解

EJB 3.2テクノロジは、コンポーネントベースのビジネス・アプリケーションを開発およびデプロイするためのサーバー側コンポーネント・アーキテクチャです。EJBテクノロジを使用することで、Java EE 7テクノロジに基づいて、安全でポータブルな分散トランザクション・アプリケーションを迅速かつ容易に開発できます。

EJB 3.2の仕様では、プログラミングおよびパッケージ化モデルの変更が簡素化されています。前のバージョンのJavaインタフェースを使用する必要がなくなり、プレーンな従来型Javaオブジェクトに注釈付けし、EJBコンポーネントとして使用できるようになりました。EJBモジュールをWebアプリケーションの内部に直接配置できるようになり、簡素化はさらに進みました。これにより、WebコンポーネントおよびEJBコンポーネントを格納するアーカイブを作成して、それらをEARファイルに結合する必要がなくなりました。

この項の内容は次のとおりです。

WebLogic ServerでのEJBドキュメント

WebLogicサーバーでのEJBの使用に関する詳細は、次のドキュメントを参照してください:

その他のEJB情報

エンタープライズBeanの利点、エンタープライズBeanの種類、ライフサイクルなどのEJBの概念についてさらに学習するには、次のWebサイトを参照してください。

セッションEJBによるビジネス・ロジックの実装

セッションBeanは、ビジネス・ロジックを実装します。セッションBeanインスタンスは、一度に1つのクライアントにサービスを提供します。セッションBeanには、ステートフル、ステートレス、およびシングルトンの3種類があります。

セッションBeanの種類とセッションBeanを使用するタイミングの詳細は、Java EE 7のチュートリアルのセッションBeanの内容に関する項を参照してください。

ステートフル・セッションBean

ステートフル・セッションBeanは、特定のクライアントとの対話を反映する状態情報をメソッドやトランザクションをまたがって維持します。ステートフル・セッションBeanは、クライアントと他のエンタープライズBeanの対話を管理するか、ワークフローを管理できます。

例: 社員が個人のプロファイル情報を表示して更新できる、ある会社のWebサイトでは、ステートフル・セッションBeanを使用して様々な他のBeanを呼び出し、ユーザーがページ上で「データの表示」をクリックした後に、次のようなユーザーが必要とするサービスを提供できます。

  • JSPからログイン・データを受け取り、ログイン・データを検証する別のEJBを呼び出す。

  • 認可の確認をJSPに送信する

  • 認可されたユーザーのプロファイル情報にアクセスするBeanを呼び出す

ステートレス・セッションBean

ステートレス・セッションBeanは、呼出し間でセッションやクライアントの状態の情報を格納しません。唯一格納されることのある状態はクライアントに固有のものではなく、キャッシュされたデータベース接続や別のEJBの参照などです。ステートレス・セッションBeanが状態を格納できるのは、長くてメソッド呼出しの期間だけです。メソッドが完了すると、状態情報は維持されません。

ステートレス・セッションBeanのインスタンスはすべて、任意のクライアントにサービスを提供できます - どのインスタンスも同等です。ステートレス・セッションBeanは、ステートフル・セッションBeanよりもパフォーマンスが優れています。その理由は、各ステートレス・セッションBeanが複数のクライアントをサポートできるからです(ただし一度に1つ)。ステートレス・セッションBeanのクライアントは、Webサービス・エンドポイントにできます。

例: 訪問者が問合せ先リンクをクリックして電子メール送信できるインターネット・アプリケーションでは、ステートレス・セッションBeanを使用して、JSPによってユーザーから収集された送信先と送信元の情報に基づいて電子メールを生成できます。

シングルトン・セッションBean

シングルトン・セッションBeanが提供する正式なプログラミング構成により、特定のJava仮想マシン(JVM)内のアプリケーションごとにセッションBeanがインスタンス化され、そのアプリケーションのライフサイクルに存在することが保証されます。シングルトンにより、エンタープライズBeanコンポーネントの複数のインスタンス間、またはアプリケーション内の複数のエンタープライズBeanコンポーネント間で、容易に状態を共有することができます。

シングルトン・セッションBeanはステートレス・セッションBeanと同様の機能を提供します。ただし、ステートレス・セッションBeanではそのプールでクライアント要求に応答するのに対して、シングルトン・セッションBeanはアプリケーションごとに1つしかありません。シングルトン・セッションBeanは、ステートレス・セッションBeanと同様に、Webサービス・エンドポイントを実装できます。シングルトン・セッションBeanではクライアントの呼出し間でその状態を保持しますが、サーバーのクラッシュまたは停止時にはその状態を保持する必要はありません。

例: 中央カウンタ・サービスを提供するインターネット・アプリケーション。ステートレス・シングルトンBeanは、Javaクライアントからコールされ、クライアントが複数回呼び出されると、カウントがそのたびに1ずつインクリメントされます。

メッセージドリブンBeanによる疎結合ビジネス・ロジックの実装

メッセージドリブンBean (MDB)は、リクエストにすぐにレスポンスする必要がない疎結合(非同期)のビジネス・ロジックを実装します。メッセージドリブンBeanは、JMSキューまたトピックからメッセージを受信し、そのメッセージの内容に基づいてビジネス・ロジックを実行します。それは、EJBとJMSの間の非同期インタフェースです。

MDBインスタンスはそのライフサイクルを通じて、同時にではありませんが複数のクライアントからのメッセージを処理できます。特定のクライアントの状態は維持されません。メッセージドリブンBeanのインスタンスはすべて同じ機能であり、EJBコンテナはどのMDBインスタンスにもメッセージを割り当てることができます。コンテナは、それらのインスタンスをプールしてメッセージのストリームの並行処理を可能にします。

EJBコンテナは、必要に応じてBeanのインスタンスを作成し、JMSメッセージをインスタンスに渡すことによってメッセージドリブンBeanと直接対話します。コンテナは、デプロイメント時にBeanのインスタンスを作成し、メッセージのトラフィックに基づいて作動時にインスタンスを追加および削除します。

『Oracle WebLogic ServerメッセージドリブンBeanの開発』を参照してください。

例:顧客から注文を受けるプロセスがサプライヤへの発注プロセスを引き起こすオンライン・ショッピング・アプリケーションでは、サプライヤへの発注プロセスをメッセージドリブンBeanで実装できます。顧客の注文が必ずサプライヤへの発注につながる一方で、そのステップは疎結合になります。その理由は、顧客の注文を確定する前にサプライヤへの発注を生成する必要はないからです。関連するサプライヤへの注文が発行される前に顧客の注文が「蓄積」されるのは問題なく、有益なことです。

EJBの構造と環境

EJBを開発するには、EJBクラス、ビジネス・インタフェースおよびヘルパー・クラス用のファイルを用意する必要があります。EJBの環境には、EJBコンテナと、オプションで1つ以上のデプロイメント記述子ファイルが含まれます。

次の各項では、各Beanタイプで必須のクラス、EJBのランタイム環境、およびBeanのランタイムの動作を管理するデプロイメント記述子ファイルについて簡単に説明します。

EJBのコンポーネント

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と同じアプリケーションで動作しているクライアント)に公開します。ローカル・クライアントから呼び出せるビジネス・メソッドを定義します。

はい

はい

はい

いいえ

ローカル・インタフェースなし

インタフェースなしのビューはローカル・ビューの1つで、個別のビジネス・インタフェースを使用せずに、Beanクラスのパブリック・メソッドが公開されます。

はい

はい

はい

はい

Beanクラス

Beanクラスはビジネス・ロジックを実装します。

はい

はい

はい

はい

EJBコンテナ

EJBコンテナとは、アプリケーション・サーバーにデプロイされたBeanの実行時コンテナです。このコンテナはアプリケーション・サーバーの起動時に自動的に作成され、Beanと次のような実行時サービスの間のインタフェースとして機能します:

  • ライフサイクル管理

  • コード生成

  • セキュリティ

  • トランザクション管理

  • ロックと同時実行性制御

組込み可能なEJBコンテナ

従来のJava EEサーバーベースの実行とは異なり、組込み可能なものを使用することで、クライアント・コードとそれに対応するエンタープライズBeanを同じ仮想マシンおよびクラス・ローダー内で実行できます。これにより、テスト、オフライン処理(バッチ・ジョブなど)、およびデスクトップ・アプリケーションのEJBプログラミング・モデルの使用に対するサポートが向上します。

Java EEサーバーのエンタープライズBeanコンテナに存在するほとんどのサービスは、注入、コンテナ管理のトランザクションおよびセキュリティを含め、組込みエンタープライズBeanコンテナで使用できます。エンタープライズBeanコンポーネントは組込みでもJava EE環境でも同様に実行されるため、同じエンタープライズBeanをスタンドアロンおよびネットワーク・アプリケーションの両方で容易に再利用できます。

組込みEnterprise Beanコンテナの詳細は、Oracle WebLogic Server Enterprise JavaBeansの開発Oracle WebLogic Serverでの組込みEJBコンテナの使用を参照してください。

EJBメタデータ・アノテーション

WebLogic Server EJB 3.2プログラミング・モデルでは、Java EE 7メタデータ・アノテーション機能を使用して、アノテーション付きEJB 3.2 Beanファイルを作成します。次に、WebLogicコンパイル・ツールweblogic.appc (またはこれと同等のAntタスクwlappc)を使用してBeanファイルをJavaクラス・ファイルにコンパイルし、必須のEJBインタフェースやオプションのデプロイメント記述子など、関連するEJBアーティファクトを生成します。

『Oracle WebLogic Server Enterprise JavaBeansの開発』アノテーション付きEJBクラスのプログラミングに関する項を参照してください。

オプションの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のクライアントと通信

EJBは、サーブレット、Javaクライアント・アプリケーション、他のEJB、Webサービス、非Javaクライアントなどのサーバー側またはクライアント側オブジェクトからアクセスできます。 EJBのクライアントは、アプリケーションが同じか別かに関係なく同じ方法でEJBにアクセスします。WebLogic Serverは、Beanにローカル・インタフェースしかない場合を除いて、リモートで機能できるEJBのホーム・インタフェースおよびビジネス・インタフェースの実装を自動的に作成します。

このトピックには、次の項があります。

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 7のチュートリアルのエンタープライズBeanへのアクセスに関する項を参照してください。

EJBの通信

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のパブリック・メソッドを呼び出すことができます。したがって、EJBへのアクセスを制限する場合は、EJBのセキュリティ・ポリシーを作成するか、セキュリティ関連のアノテーションを使用して、そのメソッドのすべてまたは一部を呼び出すことができるロールを指定できます。EJB自体のアノテーションを使用してEJBへのアクセスを制限する方法については、『Oracle WebLogic Server Enterprise JavaBeansの開発』EJBへのアクセスのセキュリティ設定に関する項を参照してください。

また、セキュリティ・ロールを作成し、ロールにユーザーをマッピングするには、WebLogic Server管理コンソールでセキュリティ・レルムを更新します。詳細は、『Oracle WebLogic Server管理コンソール・オンライン・ヘルプ』セキュリティ・ロールの管理に関する項を参照してください。

セキュリティとEJBの詳細は、次を参照してください。

WebLogic ServerでのEJBのためのロードマップ

WebLogic Serverのドキュメント・セットには、WebLogic Server環境における、EJBの開発、デプロイおよび保護の方法の理解に役立つ、いくつかの入門的なトピック、手順的なトピック、リファレンス的なトピックがサンプルとともに含まれています。

表12-2 WebLogic ServerでのEJBのためのロードマップ

主要なタスク サブタスクと追加情報

EJB 3.1の理解

単純なEJBサンプル

反復的EJB開発

アノテーション付きEJBクラスのプログラミング

EJBデプロイメントのガイドライン

Oracle WebLogic Serverでの組込みEJBコンテナの使用方法

Oracle WebLogic Serverでの永続性プロバイダの構成

リファレンス

EJB 2.xについて