nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

EJBとは

世に出ているEJBの説明はクソみたいなものが多く、簡潔に機能や特徴を記述しているものが見当たらないので書きました。Java EE 6, 7を対象として書いています。

EJBというのはJava EEアプリケーションサーバ上で利用できるJavaコンポーネントです。トランザクション制御などの煩雑な部分をEJBが自動的に面倒を見てくれるので、開発者はEJBの基本的なルールを抑えたあとはビジネスロジックの記述に集中することができる、というものです。EJBには4種類あります。

  • 基本となるステートレスセッションビーン (Stateless Session Bean, SLSB)
  • 状態を保持できるステートフルセッションビーン (Stateful Session Bean, SFSB)
  • 単一インスタンスのシングルトンセッションビーン (Singleton Session Bean, SSB)
  • メッセージ(イベント)処理を行うメッセージ駆動ビーン (Message Driven Bean, MDB)

基本となるステートレスセッションビーンには以下の特徴、機能があります。これらの便利機能はほぼ全てオプションなので、全て覚える必要はありません。インジェクションとトランザクション管理は無効にするようなシナリオが基本的に無いためデフォルトで有効になっています。

通常のJavaオブジェクトに@Statelessアノテーションを付与してjarに含め、Java EEアプリケーションサーバへデプロイするとステートレスセッションビーンとして登録されてこれらの機能が使えるようになります。

ステートフルセッションビーンはその名前の通り破棄を指示するまで状態を保持することができます。逆に、状態を保持しているので利用する際には最後に明示的に状態の破棄を行うメソッドを呼び出す必要があります。アクセスされていない状態は自動的にメモリからディスクなどへ退避されたり、クラスタ環境では状態が複製されていてひとつのサーバがダウンしても処理が継続できるようになってたりしています。

シングルトンセッションビーンは単一のインスタンスしか必要のない部分に利用します。シングルトンセッションビーンも状態を保持できます。設定情報など全体から共有する情報の保持、@Startupを付与して開始終了処理を@PostConstruct/@PreDestroyに記述したり、というような複数インスタンスがあっても意味のない場合に使われます。

MDBはいろいろな「イベント」をスレッドプールで処理することができる非同期実行のEJBです。JMSのメッセージに対して利用するのが一般的ですが、ファイルを監視したり、メールの受信をトリガーにしたりなど、多様なイベントに対応することもできます。クラスタリングされた10台のアプリケーションサーバにJMSで100万メッセージを送って、全台で分散処理、というような利用ができます。

EJBJava EE 6, 7ではCDIと比較されることがありますが、基本的にはEJBの内部的な動作の仕組みはCDIとほぼ同一であり、兄弟のような関係です。どちらもアノテーションを付与したクラスをデプロイし、コンテナからそのインスタンスを取得すると、生のクラスではなくインターセプタが設定されたプロキシインスタンスが返却され、プロキシクラスへのメソッド呼出はインターセプタを通過することででいろいろな機能が付加される、というモデルです。Java EE 7ではJTAに@Transactionalアノテーションが追加され、CDIでもトランザクション管理が行えるようになり、CDIEJBがより近づいてはきています。どちらのほうが絶対的に良いということもなく、混ぜて使っても問題ないので、場合によって使い分ければ良いと思います。