EJBは、多階層(3階層)の分散オブジェクト指向に基づいたJavaのためのサーバコンポーネントモデルです。サーバのアプリケーションとして必要なコンポーネントのライフサイクル管理、トランザクション管理などの低レベルのインタフェースを隠蔽し、ビジネスロジックの処理を記述するだけで、より抽象度の高いサーバコンポーネントを作成するためのフレームワークです。
EJBでは、サーバのアプリケーションに必要なライフサイクルなどの各種の管理処理をコンテナ(container)と呼ばれるサーバコンポーネントの入れ物で実現します。コンテナが煩雑な処理を肩代わりします。また、EJBではコンテナ上で動作するサーバコンポーネントをEnterprise Beanと呼びます。
コンテナにEnterprise Beanをインストールし、実行可能な状態にすることを配備と呼びます。EJBでは配備という方式の導入により、ある特定のコンテナに依存しないポータビリティのあるサーバコンポーネントの作成を可能にしています。
EJBでは、以下の機能を規定しています。
Enterprise Beanインスタンスのライフサイクル管理
トランザクション管理
セキュリティ管理
セション管理
リソース管理
Enterprise Beanには、大きく分けて、以下の種類があります。
Session Bean
クライアントとの対話処理を行うEnterprise Beanです。主に業務処理で必要となる処理(ビジネスロジック)を記述します。
Message-driven Bean
非同期通信処理を行うためのEnterprise Beanです。
以下に分類とそれぞれの用途について説明します。
注意
EJB2.1までの仕様では、データベースシステムなどのデータを扱うためのEntity Beanがあります。しかしEJB 3.0からはEntity Beanの代わりにJava Persistence APIを使うようになっているため、本マニュアルではEntity Beanの説明は省略します。
Session Beanとは、アプリケーションの業務ロジック(ビジネスロジック)をサーバに配置したもので、複数のクライアントに対して、ネットワークを介してサービスを提供するものです。
Session Beanでは、他のEnterprise Beanを呼び出したり、トランザクションや処理の流れを制御したり、独自の処理を実装することで業務ロジックを実行します。
Session Beanには、以下の2種類があります。
Stateful
クライアントと1対1に対応し、クライアントから呼び出される複数のメソッドにまたがって、トランザクション状態やEnterprise Beanに定義されている変数の値を保持することができます。そのため、ある機能を提供するうえで複数の手順(メソッド)が必要な場合に使用します。
Stateless
複数のメソッドにまたがって、トランザクション状態やEnterprise Beanに定義されている変数の値を保持することができません。そのため、1つのメソッドで完結する機能を提供する場合に使用します。また、複数のクライアントが、同じSession Beanのインスタンスを共有することができるため、サーバの負荷を軽減することができます。
例えば、単なる四則演算を行うような処理をSession Beanで実現するような場合にはStatelessにすべきです。保持しなければならない情報がないので、Statelessにしてサーバの負荷を減らします。一方、オンラインショッピングサイトのショッピングカートをSession Beanで実現する場合、これはStatefulにすべきです。ユーザが買い物かごにどの商品を入れたかを複数のページに渡って保持する必要があるからです。
Message-driven Beanとは、クライアントから送信されたメッセージに対して非同期に処理を行うための基盤を提供するものです。
Message-driven BeanからSession Beanなどを呼び出すことで、その機能を非同期に実行できます。
Message-driven Beanは、JMSメッセージまたはリソースアダプタのメッセージを受信して処理します。JMSメッセージの場合は、メッセージの処理の方法で以下の2種類に分類できます。
Point-To-Pointモデル
送信者から送信された1つのメッセージに対して、特定の受信者が処理を行います。すなわち、メッセージに対して受信者を単独で割り当てる場合に使用します。
このモデルでは、送信されたメッセージはJMSサーバ上のキューに貯えられます。貯えられたメッセージは特定の受信者に割り当てられて処理されます。
Publish/Subscribeモデル
送信者から送信された1つのメッセージに対して、複数の受信者が処理を行います。すなわち、同一のメッセージを複数の受信者に配信する必要がある場合に使用します。
このモデルでは、送信されたメッセージはJMSサーバ上のトピックに貯えられます。貯えられたメッセージはすべての受信者に割り当てられて各受信者によって処理されます。
Java EE 7に含まれるEJB仕様はEJB 3.2です。
ポイント
EJB 3.2の詳細情報については、以下の規約を参照してください。
JSR 345: Enterprise JavaBeans 3.2