Java > JavaEE > EnterpriseBeans > EnterpriseBeans

  • エンタープライズビーンはEJBを実装したコンポーネント
  • エンタープライズビーンはEJBコンテナ上で動作
  • EJBコンテナはシステムレベルのサービスを提供
    • トランザクション
    • セキュリティ

What Is an Enterprise Bean?

  • ビジネスロジックをカプセル化するサーバサイドコンポーネント

Benefits of Enterprise Beans

  • エンタープライズビーンにより巨大な分散アプリの開発が楽になる
    • EJBコンテナがシステムレベルのサービスを提供してくれる
      • トランザクション管理
      • セキュリティ
  • ビジネスロジックがエンタープライズビーンにカプセル化されることで、クライアントをthinにできる
  • JavaEEサーバであればどこでも動く

When to Use Enterprise Beans

  • スケーラビリティが求められる時
    • 複数台のサーバにわたって、コンポーネントを分散する
    • エンタープライズビーンは異なるマシンで動くだけでなく、それらの場所はクライアントにたいして透過的

Types of Enterprise Beans

  • Session
    • クライアントに対するタスク実行
    • Webサービスの実装も
  • Message-driven
    • 特定の種類のメッセージングに対するリスナー
    • JMSとか

What Is a Session Bean?

  • クライアントによって実行されるビジネスロジックをカプセル化
    • ローカル
    • リモート
    • Webサービス
  • セッションビーンのデータはDBに保存されない

Types of Session Beans

Stateful Session Beans

Stateless Session Beans

Singleton Session Beans

When toUse Session Beans

  • ステートフルセッションビーンが適している時
    • ビーンがクライアントとのやり取りの情報をもつ
    • 複数のメソッド実行にわたってクライアントの情報を保持
    • クライアントとほかのコンポーネントとの仲介
    • いろいろなエンタープライズビーンのワークフローを管理する
  • パフォーマンス改善のためにステートレスにできる時
    • 特定のクライアント向けの情報なし
    • 1メソッドの実行で、すべてのクライアント向けの汎用的なタスクを実行
    • Webサービスを実装するとき
  • シングルトンが適している時
    • アプリケーションにわたって、状態を共有
    • 1つのエンタープライズビーンが複数スレッドからアクセスされるとき
    • アプリケーションの起動と終了のタスクを実装
    • Webサービスを実装するとき

What Is a Message-Driven Bean?

  • JavaEEアプリケーションで非同期にメッセージを処理するためのエンタープライズビーン
    • JMSメッセージやほかのメッセージに対するリスナ
    • メッセージいろんなところから送信される
      • JavaEEコンポーネント(クライアント、Webコンポーネント、エンタープライズビーン)
      • JMSアプリケーション
      • JavaEE以外のアプリケーション

What Makes Message-Driven Beans Different from Session Beans?

  • クライアントはメッセージ駆動ビーンに対してインターフェースでアクセスはしない
  • ステートレスセッションビーンに似ている
    • 特定のクライアント向けの情報を保持しない
    • どのビーンインスタンスも同じように振る舞う
      • EJBコンテナはメッセージを同時に処理するためにビーンをプールできる
    • あるビーンはどのクライアントからのメッセージでも処理できる
  • メッセージ駆動ビーンのインスタンス変数は以下を含む
    • JMSのコネクション
    • DBコネクション
    • ほかエンタープライズビーンへの参照
  • クライアントコンポーネントは、メッセージ駆動ビーンを直接呼び出すことはせずJMSなどメッセージを送信して連携する
  • メッセージ駆動ビーンの特徴
    • 1つのクライアントメッセージを処理する
    • 非同期で実行される
    • 生存期間は短い
    • 共有されるDBなどのデータは表現せず、アクセスする
    • transaction-aware
      • メッセージング処理全体でトランザクションをはれる
    • ステートレス

When toUse Message-Driven Beans

  • セッションビーンにJMSメッセージを送信すると同期的に結果を得られる
  • 同期でブロッキングされたくないので、普通はメッセージ駆動ビーンを使ってJMSメッセージを非同期で処理する

Accessing Enterprise Beans

  • クライアントに対するIFを持たないメッセージ駆動ビーンには適用されない
  • クライアントからエンタープライズビーンへのアクセスはビュー
    • no-interface view:インターフェースなしの場合のpublicメソッド
    • business interface:ビジネスメソッドインターフェース
  • ビジネスメソッドのルール
    • メソッド名はejbで始まらない
    • public
    • リモートビジネスインターフェースでアクセスさせる場合は、パラメータと戻り値はJava RMI 的に正しい型
    • Webサービスエンドポイントの場合は、@WebMethodつきメソッドのパラメータと戻り値はJAX RS 的に正しい型
    • static, finalはだめ
    • システムエラーの場合は、javax.ejb.EJBExceptionをthrowするべき
  • クライアントはEJB層の複雑さを気にしなくていい
  • エンタープライズビーンのビューは、なるべく変更が発生しないように設計する
  • セッションビーンはbusiness interfaceを実装するべき
  • 複数のインターフェースを実装するときは、どのインターフェースがビジネスインターフェースかを指定するために、インターフェースまたは、ビーンに@Localまたは@Remoteをつける
    • Serializable, Externalizable, javax.ejbパッケージのインターフェースは除外

Using Enterprise Beans in Clients

  • クライアントがエンタープライズビーンへの参照を取得する方法
    • DI
      • JavaEEサーバ管理下にあるクライアント(JSF, JAX-RS, ...)向け
    • JNDI
      • JavaEEサーバ管理下にないクライアント向け
  • Portable JNDI Syntax
  • java:global
    • リモートエンタープライズビーンを参照
      java:global[/application name]/module name/enterprise bean name[/interface name]
      
    • application name:EARファイルの場合に必要。EARファイル名
    • interface name:複数のビジネスインターフェースを実装している場合に必要
  • java:module
    • 同一モジュール内のローカルエンタープライズビーンを参照
      java:module/enterprise bean name/[interface name]
      
    • interface name:複数のビジネスインターフェースを実装している場合に必要
  • java:app
    • 同一アプリケーション(同一EARファイル内)のローカルエンタープライズビーンを参照
      java:app[/module name]/enterprise bean name[/interface name]
      
    • module name:オプション
    • interface name:複数のビジネスインターフェースを実装している場合に必要

Deciding on Remote or Local Access

  • エンタープライズビーンのクライアントからのアクセス方法を決める
    • リモート
    • ローカル
    • Webサービス
  • ローカルかリモートかの判断ポイント
    • 関連するビーン同士の連携(タイト or ルーズ)
    • クライアントの種類
      • アプリケーションクライアント
      • Webコンポーネントや他のエンタープライズビーン
    • コンポーネントの分散
    • パフォーマンス
      • ネットワーク通信をへらすためにローカルに
      • 全体のパフォーマンスを上げるために分散に
  • エンタープライズビーンがどのアクセス種別かが判断できない場合は、とりあえずリモートアクセスにすると柔軟
  • エンタープライズビーンがリモートとローカルアクセスを両方許せるようにできる

Local Clients

  • ローカルクライアントの特徴
    • エンタープライズビーンと同一アプリケーション内
    • Webコンポーネントまたは、他のエンタープライズビーン
    • エンタープライズビーンの位置は透過的ではない
  • no-interface viewにアクセス
    • ローカルのビュー
    • ローカルクライアントはpublicメソッドに対してアクセスする
    • ビジネスインターフェースなし
  • ローカルビジネスインターフェースにアクセス
    • ビジネス、ライフサイクルメソッド
    • ビジネスインターフェースとビーンのインターフェース参照に@Local、@Remoteをつけない場合
    • ビジネスインターフェースまたはビーンのインターフェース参照に@Localを付与

Accessing Local Enterprise Beans Using the No-Interface View

  • @EJBをプロパティ(ビーン)に付与して、DIで解決
  • ビーンをJNDIルックアップで解決
    InitialContext.lookup("java:module/ExampleBean");
    

Accessing Local Enterprise Beans That Implement Business Interfaces

  • @EJBをプロパティ(ローカルインターフェース)に付与して、DIで解決
  • ローカルインターフェースをJNDIルックアップで解決
    InitialContext.lookup("java:module/Example");
    

Remote Clients

  • リモートクライアントの特徴
    • エンタープライズビーンとは異なるマシン、JVM
    • Webコンポーネント、アプリケーションクライアント、エンタープライズビーン
    • エンタープライズビーンへの参照は透過的
    • ビジネスインターフェースを必ず経由
  • ビジネスインターフェースまたは、ビーンのビジネスインターフェース参照に@EJBを付与
    • エンタープライズビーンへのアクセス
  • @EJBをプロパティ(リモートインターフェース)に付与して、DIで解決
  • リモートインターフェースをJNDIルックアップで解決
    InitialContext.lookup("java:global/myApp/ExampleRemote");
    

Web Service Clients

  • Webサービスクライアントのアクセス方法
    • JAX-RS
    • ステートレスセッションビーンのビジネスメソッド呼び出し
  • エンタープライズビーン、WebコンポーネントもWebサービスクライアントになりえる
  • ステートレスセッションビーンでWebサービスする
    • すべてのpublicメソッドがWebサービスとしてアクセス可能
    • @WebMethodでWebサービスメソッドのカスタマイズを行う
    • @WebMethodをつけた場合は、@WebMethodがついているメソッドのみWebサービスとしてアクセス可能

Method Parameters and Access

  • ビーンメソッドのパラメータの振る舞いが、アクセス種類より変わる

Isolation

  • リモート呼び出しでは、パラメータはコピー
    • クライアントのパラメータオブジェクトへの変更はサーバ側に影響しない
  • ローカル呼び出しでは、パラメータは同じ
    • クライアントとサーバで同じパラメータオブジェクトを参照
    • この仕組みに頼った実装はさけるべき
  • Webサービスはリモート呼び出しと同様

Granularity of Accessed Data

  • リモート呼び出しでは、呼び出し回数を減らすためにパラメータオブジェクトをcoarse-grainedにする

The Contents of an Enterprise Bean

  • エンタープライズビーンを開発するときに作るファイル
    • エンタープライズビーンクラス
    • ビジネスインターフェース
    • ヘルパークラス
  • 作成したファイルをEJB-JARファイルまたは、WARに含める

Packaging Enterprise Beans in EJB JAR Modules

  • JavaEEアプリケーションをまとめる
    • EJB JARファイルなどの複数のモジュールをEARファイルにまとめてデプロイ
    • EJB JAR単独でデプロイ

Packaging Enterprise Beans in WAR Modules

  • エンタープライズビーンは、WARの中にクラスファイルまたはJARファイルとして含められる
    • エンタープライズビーンがWebアプリケーションのビジネスロジックを実装する場合
    • 開発や管理がシンプルにできる
  • クラスはファイルはWEB-INF/classes
  • JARファイルはWEB-INF/lib
  • ejb-jar.xmlは必須でない
    • ejb-jar.xmlを作る場合は、WEB-INFに配置
  • EJB JAR形式のJARをWEB-INF/libにおいても、EJB JARとしては扱われない
    • WEB-INF/classesのクラスと同じ扱い
    • スコープはWARモジュール

Naming Conventions for Enterprise Beans

  • エンタープライズビーンの命名規約
    エンタープライズビーン名 XxxBean
    エンタープライズビーンクラス XxxBean
    ビジネスインターフェース Xxx

The Lifecycles of Enterprise Beans

  • エンタープライズビーンの種類によってライフサイクルが違う
    • ステートフルセッション
    • ステートレスセッション
    • シングルトンセッション
    • メッセージ駆動
  • ライフサイクルメソッドは public void xxx()

The Lifecycle of a Stateful Session Bean

  • 状態
    • Not Exsist
    • Ready
    • Passive
  • Not Exsist -> Ready
    • クライアントがビーンを参照するとき
      1. インスタンス生成
      2. DI
      3. @PostConstract
  • Ready <-> Passive
    • コンテナはLLUアルゴリズムで、メモリからファイルへビーンをパッシベート
      • @PrePassivate実行
    • Passiveでクライアントから要求が来たらファイルからメモリへビーンをアクティベート
      • @PostActivate実行
  • -> Not Exsist
    • ライフサイクルの終わりにクライアントは@Removeメソッドを呼び出す
    • @Removeメソッド実行後に@PostDestroy実行

The Lifecycle of a Stateless Session Bean

  • 状態
    • Not Exsist
    • Ready
  • コンテナはライフサイクルの初めにプールの生成と維持を行う
  • Not Exsist -> Ready
    1. DI
    2. @PostConstract Ready -> Not Exsist
  • ライフサイクル終了時に@PreDestroyを実行

The Lifecycle of a Singleton Session Bean

  • 状態
    • Not Exsist
    • Ready
  • コンテナはライフサイクルの初めにシングルトンの生成を行う
    • @Startupがついていたら、デプロイ時に実行される
  • Not Exsist -> Ready
    1. DI
    2. @PostConstract Ready -> Not Exsist
  • ライフサイクル終了時に@PreDestroyを実行

The Lifecycle of a Message-Driven Bean

  • 状態
    • Not Exsist
    • Ready
  • コンテナはメッセージ駆動ビーンのプールを作成
  • Not Exsist -> Ready
    1. DI
    2. @PostConstract Ready -> Not Exsist
  • ライフサイクル終了時に@PreDestroyを実行
最終更新:2012年09月15日 14:49
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。