1 EJBの理解
この章の内容は次のとおりです:
EJBの新機能と変更された機能
WebLogic Server 15.1.1.0.0では、Jakarta Enterprise Beans 4.0仕様がサポートされます。
ノート:
EJB 4.0では、パッケージ・ネームスペースがjavax.*からjakarta.*に変更されました。
変更点や以前のEJB仕様との比較の詳細は、Jakarta Enterprise Beans 4.0仕様のWhat is New in This Releaseを参照してください。
親トピック: EJBの理解
EJBコンポーネントの理解
Jakarta Enterprise Beans (EJB)テクノロジは、Jakarta EEのサーバー側コンポーネント・アーキテクチャです。EJB テクノロジを使用することで、Javaテクノロジに基づいて、安全でポータブルな分散トランザクション・アプリケーションを迅速かつ容易に開発できます。
セッションEJBによるビジネス・ロジックの実装
セッションBeanは、ビジネス・ロジックを実装します。セッションBeanには、ステートフル、ステートレス、およびシングルトンの3種類があります。ステートフル・セッションBeanおよびステートレス・セッションBeanは一度に1つのクライアントとして機能します。一方、シングルトン・セッションBeanは並列して呼び出すことができます。
セッションBeanの種類およびそれらを使用するタイミングの詳細は、Jakarta EEチュートリアルのEnterprise Beansの章の「What Is a Session Bean」を参照してください。
ステートフル・セッションBean
ステートフル・セッションBeanは、特定のクライアントとの対話を反映する状態情報をメソッドやトランザクションをまたがって維持します。ステートフル・セッションBeanは、クライアントと他のエンタープライズBeanの対話を管理するか、ワークフローを管理できます。
例: 社員が個人のプロファイル情報を表示して更新できる、ある会社のWebサイトでは、ステートフル・セッションBeanを使用して他の様々なBeanを呼び出し、ユーザーがページ上でデータの表示をクリックした後にユーザーが必要とする次のようなサービスを提供できます。
-
JSPからログイン・データを受け付け、そのログイン・データを検証する別のEJBを呼び出す
-
認可の確認をJSPに送信する
-
認可されたユーザーのプロファイル情報にアクセスするBeanを呼び出す
親トピック: セッションEJBによるビジネス・ロジックの実装
ステートレス・セッションBean
ステートレス・セッションBeanは、呼出し間でセッションやクライアントの状態の情報を格納しません。唯一格納されることのある状態はクライアントに固有のものではなく、キャッシュされたデータベース接続や別のEJBの参照などです。ステートレス・セッションBeanが状態を格納できるのは、長くてメソッド呼出しの期間だけです。メソッドが完了すると、状態情報は維持されません。
ステートレス・セッションBeanのインスタンスはすべて、どのクライアントにもサービスを提供できます(どのインスタンスも機能は同じ)。ステートレス・セッションBeanは、ステートフル・セッションBeanよりもパフォーマンスが優れています。その理由は、各ステートレス・セッションBeanが複数のクライアントをサポートできるからです(ただし一度に1つ)。ステートレス・セッションBeanのクライアントは、Webサービス・エンドポイントにできます。
例: 訪問者が「連絡先」リンクをクリックして電子メール送信できるインターネット・アプリケーションでは、ステートレス・セッションBeanを使用して、JSPによってユーザーから収集された送信先と送信元の情報に基づいて電子メールを生成できます。
親トピック: セッションEJBによるビジネス・ロジックの実装
シングルトン・セッションBean
シングルトン・セッションBeanでは、セッションBeanが特定のJava仮想マシン(JVM)のアプリケーションごとに1回のみインスタンス化され、そのアプリケーションのライフサイクルで存在することを保証する正式なプログラミング構造を提供しています。シングルトンでは、エンタープライズBeanコンポーネントの複数のインスタンス間、またはアプリケーションの複数のエンタープライズBeanコンポーネント間で状態を容易に共有できます。
シングルトン・セッションBeanはステートレス・セッションBeanと同様の機能を提供します。ただし、ステートレス・セッションBeanではそのプールでクライアント要求に応答するのに対して、シングルトン・セッションBeanはアプリケーションごとに1つしかありません。シングルトン・セッションBeanは、ステートレス・セッションBeanと同様に、Webサービス・エンドポイントを実装できます。シングルトン・セッションBeanではクライアントの呼出し間でその状態を保持しますが、サーバーのクラッシュまたは停止時にはその状態を保持する必要はありません。
例: ApacheのWebサイトでは、「Simple Singleton: ComponentRegistry」のサンプルが提供されています。この例では、シングルトンBeanでContainer-Managed Concurrencyを使用して、読取り(@Lock(READ))機能(Beanへのマルチスレッド・アクセスが可能)と書込み(@Lock(WRITE))機能(Beanへのシングルスレッド・アクセスを強制)を利用する方法を説明しています。
親トピック: セッションEJBによるビジネス・ロジックの実装
メッセージドリブンBeanによる疎結合ビジネス・ロジックの実装
メッセージドリブンBeanは、リクエストに対するレスポンスが即時である必要のない疎結合(非同期)のビジネス・ロジックを実装します。メッセージドリブンBeanは、JMSキューまたトピックからメッセージを受信し、そのメッセージの内容に基づいてビジネス・ロジックを実行します。それは、EJBとJMSの間の非同期インタフェースです。
MDBインスタンスはそのライフサイクルを通じて、同時にではありませんが複数のクライアントからのメッセージを処理できます。特定のクライアントの状態は維持されません。メッセージドリブンBeanのインスタンスはすべて同じ機能であり、EJBコンテナはどのMDBインスタンスにもメッセージを割り当てることができます。コンテナは、それらのインスタンスをプールしてメッセージのストリームの並行処理を可能にします。
EJBコンテナは、必要に応じてBeanのインスタンスを作成し、JMSメッセージをインスタンスに渡すことによってメッセージドリブンBeanと直接対話します。コンテナは、デプロイメント時にBeanのインスタンスを作成し、メッセージのトラフィックに基づいて作動時にインスタンスを追加および削除します。
詳細は、『Oracle WebLogic ServerメッセージドリブンBeanの開発』を参照してください。
例:顧客から注文を受けるプロセスがサプライヤへの発注プロセスを引き起こすオンライン・ショッピング・アプリケーションでは、サプライヤへの発注プロセスをメッセージドリブンBeanで実装できます。顧客の注文が必ずサプライヤへの発注につながる一方で、そのステップは疎結合になります。その理由は、顧客の注文を確定する前にサプライヤへの発注を生成する必要はないからです。関連するサプライヤへの注文が発行される前に顧客の注文が「蓄積」されるのは問題なく、有益なことです。
親トピック: EJBコンポーネントの理解
EJBの構造と環境
以下の節では、各Beanタイプで必須のクラス、EJB実行時環境、およびBeanの実行時の動作を管理するデプロイメント記述子ファイルについて簡単に説明します。
EJBの構成要素
BeanタイプごとにBeanクラスが必要になります。表1-1では、各タイプのEJBを構成する際にサポートされるクライアント・ビューと、追加で必要なクラスを定義しています。
ノート:
EJB 2.1以前のAPIでは、ローカルおよびリモート・クライアントが、セッションBeanのローカルまたはリモート・ホームおよびローカルまたはリモート・コンポーネント・インタフェースによって、ステートフルまたはステートレス・セッションBeanにアクセスする必要がありました。これらのインタフェースはEJB 4.0でも使用し続けることができますが、EJB 2.1のリモートおよびローカル・クライアント・ビューは、シングルトン・セッションBeanではサポートされません。
『デプロイメント記述子を使用したJakarta Enterprise Beansの開発』のEJBのクラスとインタフェースを作成するを参照してください。
表1-1 EJB 3.2でサポートされるクライアント・ビュー
| クライアント・ビュー | セッションBeanのタイプ | 追加で必要なクラス |
|---|---|---|
|
リモート・クライアント |
ステートフル、ステートレスおよびシングルトン・セッションBean |
Beanのビジネス・メソッドとライフサイクル・メソッドを定義するリモート・ビジネス・インタフェース。 |
|
ローカル・クライアント |
ステートフル、ステートレスおよびシングルトン・セッションBean |
Beanのビジネス・メソッドとライフサイクル・メソッドを定義するローカル・ビジネス・インタフェース。 |
|
ローカル・インタフェースなし |
ステートフル、ステートレスおよびシングルトン・セッションBean |
Beanクラスのみ必要とします。 |
|
Webサービス・クライアント |
ステートレスおよびシングルトン・セッションBean |
JAX-WSクライアント・ビューAPIを使用してJAX-WSサービス・エンドポイントとしてアクセスされるWebサービス・エンドポイント。 |
親トピック: EJBの構造と環境
EJBコンテナ
EJBコンテナとは、アプリケーション・サーバーにデプロイされたBeanの実行時コンテナです。このコンテナはアプリケーション・サーバーの起動時に自動的に作成され、Beanと以下のような実行時サービスの間のインタフェースとして機能します。
-
ライフサイクル管理
-
コード生成
-
セキュリティ
-
トランザクションの管理
-
ロックと同時実行性制御
親トピック: EJBの構造と環境
EJBメタデータ・アノテーション
WebLogic Server EJBプログラミング・モデルでは、Jakarta EEメタデータ・アノテーション機能を使用して、アノテーション付きEJB Beanファイルを作成し、標準Javaコンパイラでクラスをコンパイルします。生成されたクラスは、デプロイメント用のターゲット・モジュールにパッケージ化できます。実行時に、WebLogic Serverはアノテーションを解析して、必要な動作のアスペクトをBeanファイルに適用します。
「アノテーション付きEJBクラスのプログラミング」を参照してください。
親トピック: EJBの構造と環境
オプションのEJBデプロイメント記述子
EJB 3.0以降では、EJBデプロイメント記述子ファイル(ejb-jar.xmlなど)を作成する必要がなくなりました。ただし、必要に応じて、引き続きXMLデプロイメント記述子を使用することはできます。競合がある場合、デプロイメント記述子の値がアノテーションの値をオーバーライドします。
EJB実装で引き続きデプロイメント記述子を使用する場合は、『デプロイメント記述子を使用したJakarta Enterprise Beansの開発』のEJBデプロイメント記述子を参照してください。
WebLogic Server EJBコンテナでは、次の3つのデプロイメント記述子がサポートされます。
-
ejb-jar.xml- 標準Java EEデプロイメント記述子です。ejb-jar.xmlは、EJBを定義してEJBの標準的な構成設定を指定する際に使用できます。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デプロイメント記述子の詳細は、『デプロイメント記述子を使用したJakarta Enterprise Beansの開発』のデプロイメント記述子スキーマおよび文書型定義リファレンスを参照してください。
親トピック: EJBの構造と環境
EJBのクライアントおよび通信
EJBは、サーブレット、Javaクライアント・アプリケーション、他のEJB、Webサービス、非Javaクライアントなどのサーバー側またはクライアント側オブジェクトからアクセスできます。EJBのクライアントは、アプリケーションが同じか別かに関係なく同じ方法でEJBにアクセスします。WebLogic Serverは、リモートで機能できるEJBのリモート・ホーム・インタフェースおよびリモート・ビジネス・インタフェースの実装を自動的に作成します。
EJBへのアクセス
クライアントは、インタフェースなしのビューまたはビジネス・インタフェースを介してエンタープライズBeanにアクセスします。エンタープライズBeanのインタフェースなしのビューでは、エンタープライズBean実装クラスのパブリック・メソッドをクライアントに公開します。エンタープライズBeanのインタフェースなしのビューを使用しているクライアントは、エンタープライズBean実装クラスまたはその実装クラスの任意のスーパークラスの任意のパブリック・メソッドを呼び出すことができます。ビジネス・インタフェースは、エンタープライズBeanのビジネス・メソッドを含む標準のJavaプログラミング言語インタフェースです。
エンタープライズBeanのクライアントは、エンタープライズBeanのインスタンスへの参照を取得します。そのためには、Javaプログラミング言語のアノテーションで依存関係インジェクションを使用するか、エンタープライズBeanインスタンスを検索するJNDI構文を使用してJNDIルックアップを実行します。
エンタープライズBeanインタフェースを取得する最も簡単な方法は、依存関係インジェクションです。Jakarta EEサーバー管理対象の環境、Jakarta Server Faces Webアプリケーション、JAX-RS Webサービス、その他のエンタープライズBean、またはJakarta EEアプリケーション・クライアントの中で実行されるクライアントは、jakarta.ejb.EJBアノテーションを使用した依存関係インジェクションをサポートします。
Jakarta EEサーバー管理対象環境の外部で実行されるアプリケーション(Java SEアプリケーションなど)は、明示的ルックアップを実行する必要があります。JNDIでは、Jakarta EEコンポーネントを識別して明示的ルックアップを単純化するグローバル構文をサポートします。詳細は、「JNDIポータブル構文の使用」を参照してください。
ネットワークのオーバーヘッドのため、Beanにはリモート・クライアントからアクセスするよりも同じマシン上のクライアントからアクセスする方が効率的であり、クライアントが同じアプリケーションにあればさらに効率的です。
クライアントによるEJBへのアクセスのプログラミングの詳細は、Jakarta EEチュートリアルのEnterprise Beansの章の「Accessing Enterprise Beans」を参照してください。
親トピック: EJBのクライアントおよび通信
EJBの通信
WebLogic Server EJBは、以下のプロトコルを使用します。
-
T3 - リモート・オブジェクトとの通信に使用します。T3は、Remote Method Invocation (RMI)プロトコルを実装するWebLogic独自のリモート・ネットワーク・プロトコルです。
-
RMI - リモート・オブジェクトとの通信に使用します。RMIを使用すると、アプリケーションはネットワークの他のどこかにあるオブジェクトの参照を取得し、同じJVMでクライアントと共存しているかのようにそのオブジェクトのメソッドをクライアントの仮想マシンからローカルで呼び出すことができます。リモート・インタフェースのあるEJBはRMIオブジェクトです。WebLogic RMIの詳細は、『Oracle WebLogic Server RMIアプリケーションの開発』を参照してください。
-
HTTP - EJBは、
java.net.URLリソース接続ファクトリを使用してWebLogic Server環境外のWebサーバーとのHTTP接続を取得できます。『デプロイメント記述子を使用したJakarta Enterprise Beansの開発』のEJBの構成によるURLへのリクエストの送信を参照してください。
EJBが使用するネットワーク接続の属性は、EJBをWebLogic Serverカスタム・ネットワーク・チャネルにバインドすることによって指定できます。『Oracle WebLogic Serverサーバー環境の管理』のネットワーク・リソースの構成を参照してください。
親トピック: EJBのクライアントおよび通信
EJBのセキュリティ
デフォルトでは、EJBのパブリック・メソッドはどのユーザーでも呼び出すことができます。そのため、EJBへのアクセスを制限する場合は、セキュリティ関連アノテーションを使用して、すべてのメソッドまたはメソッドのサブセットを呼び出すことができるロールを指定します。これは、「EJBへのアクセスにセキュリティを設定する」で説明します
セキュリティおよびEJBの追加情報は、以下を参照してください。
-
『Oracle WebLogic Serverセキュリティの理解』のセキュリティの基礎に、認証、認可など、セキュリティ関連の基礎的な情報があります。
-
『WebLogicセキュリティ・サービスによるアプリケーションの開発』のJakarta Enterprise Beans (EJB)の保護では、EJBの認証と認可を構成する手順について説明されています。
親トピック: EJBの理解