「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層の複雑さを気にしなくていい
-エンタープライズビーンのビューは、なるべく変更が発生しないように設計する
-セッションビーンはbusiness interfaceを実装するべき
**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
-エンタープライズビーンの種類によってライフサイクルが違う
--ステートフルセッション
--ステートレスセッション
--シングルトンセッション
--メッセージ駆動
**The Lifecycle of a Stateful Session Bean
-状態
--Not Exsist
--Ready
--Passive
-Not Exsist -> Ready
--クライアントがビーンを参照するとき
+++インスタンス生成
+++DI
+++@PostConstract
-Ready <-> Passive
--コンテナはLLUアルゴリズムで、メモリからファイルへビーンをパッシベート
---@PrePassivate実行
--Passiveでクライアントから要求が来たらファイルからメモリへビーンをアクティベート
---@PostActivate実行
- -> Not Exsist
--ライフサイクルの終わりにクライアントは@Removeメソッドを呼び出す
--@PostDestroy実行
**The Lifecycle of a Stateless Session Bean
-状態
--Not Exsist
--Ready
-コンテナはライフサイクルの初めにプールの生成と維持を行う
-Not Exsist -> Ready
++DI
++@PostConstract
Ready -> Not Exsist
-ライフサイクル終了時に@PreDestroyを実行
**The Lifecycle of a Singleton Session Bean
-状態
--Not Exsist
--Ready
-コンテナはライフサイクルの初めにシングルトンの生成を行う
--@Startupがついていたら、デプロイ時に実行される
-Not Exsist -> Ready
++DI
++@PostConstract
Ready -> Not Exsist
-ライフサイクル終了時に@PreDestroyを実行
***The Lifecycle of a Message-Driven Bean
-状態
--Not Exsist
--Ready
-コンテナはメッセージ駆動ビーンのプールを作成
-Not Exsist -> Ready
++DI
++@PostConstract
Ready -> Not Exsist
-ライフサイクル終了時に@PreDestroyを実行
-エンタープライズビーンは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
--クライアントがビーンを参照するとき
+++インスタンス生成
+++DI
+++@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
++DI
++@PostConstract
Ready -> Not Exsist
-ライフサイクル終了時に@PreDestroyを実行
**The Lifecycle of a Singleton Session Bean
-状態
--Not Exsist
--Ready
-コンテナはライフサイクルの初めにシングルトンの生成を行う
--@Startupがついていたら、デプロイ時に実行される
-Not Exsist -> Ready
++DI
++@PostConstract
Ready -> Not Exsist
-ライフサイクル終了時に@PreDestroyを実行
***The Lifecycle of a Message-Driven Bean
-状態
--Not Exsist
--Ready
-コンテナはメッセージ駆動ビーンのプールを作成
-Not Exsist -> Ready
++DI
++@PostConstract
Ready -> Not Exsist
-ライフサイクル終了時に@PreDestroyを実行