目次 | 前
| 次
6. セションBean部品契約
6.では,セションBeanとそのコンテナとの間の契約を規定し,セションBeanインスタンスのライフサイクルを定義する。
セションBean状態管理の開発者のビュー及びそれを管理するコンテナの責任を定義する。
6.1 概観
定義によって,セションBeanインスタンスとは,それを生成するクライアントの外延とする。
-
このフィールドには,クライアントの会話状態を含む。この状態は,特定のクライアント及びインスタンスの対で表現する会話を示す。
-
クライアントに代わって,データベースの中のデータを読み込み,更新する。一つのトランザクション内では,
このデータのあるものが,Beanにキャッシュされてもよい。
-
寿命は,クライアントの寿命と同じとする。
セションBeanインスタンスの一生は,コンテナ固有のタイムアウト又は実行サーバのクラッシュによっても終了するかもしれない。
このため,使用中のインスタンスがなくなった場合に備え,クライアントは,
常に新しいインスタンスを再生成可能にしておかなければならない。
セションBeanの会話状態は,通常データベースに書き込まれない。Bean開発者は,単に,Beanのフィールドにそれを記憶し,Beanの寿命中は値が保持されるものと仮定する。
一方,キャッシュされたデータベースデータは,Beanで明示的に管理しなければならない。
Beanは,Beanのトランザクション完了に先立って,キャッシュされたデータベース更新をすべて書き込まなければならないし,
次のトランザクション開始時には,失効した可能性のあるデータベースデータのすべてのコピーを一新しなければならない。
6.2 目標
セションBeanモデルは,同じ機能をクライアントで直接開発するのと同程度の単純性をもつセションBeanの開発を目的とする。
セションBeanコンテナは,セションBeanのライフサイクルを管理し,Beanの動作が必要となる場合にはそれを通知し,
Bean実装が大量のクライアントでもサポート可能とするために完全なサービスを提供する。
6.の残りでは,セションBeanのライフサイクルを詳しく示し,さらに,Beanとそのコンテナとの間のプロトコルについて示す。
6.3 コンテナの作業集合の管理
作業集合のサイズを効率的に管理するために,セションBeanコンテナは,使用していないセションBeanの状態を,
一時的に2次記憶装置に転送する必要があるかもしれない。作業集合から2次記憶装置への転送を,非活性化と呼ぶ。
2次記憶装置から作業集合への転送を,活性化と呼ぶ。
Beanがトランザクション状態にない場合だけ,コンテナは,セションBeanを非活性化してよい。
コンテナの状態管理を支援するために,セションBeanは,配置時に,次の状態管理モードのいずれかを指定する。
-
状態付き(STATELESS)
Beanは,メソッド間の会話状態を含まない。いかなるBeanインスタンスも,任意のクライアントで使用できる。
-
無状態(STATEFUL)
Beanは,複数のメソッド及び複数のトランザクションに渡って保持されなければならない会話状態を含む。
6.4 会話状態
状態付きセションBeanの会話状態は,そのフィールド値に, セションBeanのフィールドから到達可能なオブジェクトの推移閉包を加えたものとして定義する。
セションBeanインスタンスの推移閉包は,Javaプログラム言語に対応する標準直列化プロトコルで定義する。
エンタプライズBeanインスタンスを直列化することによって記憶されるフィールドは,エンタプライズBean状態の一部と考えられる。
拡張規定の場合には,セションBeanの会話状態は,オープンされた資源を含んでもよい。例としては,オープンしたファイル,
オープンしたソケット及びオープンしたデータベースカーソルがある。セションBeanが非活性化されている間は,
コンテナは,オープンされた資源を保持することはできない。このセションBeanの開発者は,通知ejbPassivate及び通知
ejbActivateを使用して,資源を閉じたり,開いたりしなければならない。
6.4.1 インスタンス非活性化及び会話状態
コンテナは,インスタンス上のメソッドejbPassivateを呼び出した後で,そのインスタンスの状態に関する
Javaプログラム言語の直列化(又はそれと同等なもの)を実行する。エンタプライズBean開発者は,インスタンスの状態を
ejbPassivate完了後に直列化可能としなければならない。インスタンスがejbPassivate後に直列化できない場合は,
コンテナが,インスタンスを破壊する可能性がある。
インスタンスは,他のEJBオブジェクト(セションオブジェクト又は実体オブジェクト)へのEJBオブジェクト参照を保持しているかもしれない。
コンテナがejbPassivate後にインスタンスを非活性化する場合,非活性化されたインスタンスと共に,
そのEJBオブジェクト参照を記憶しなければならない。ejbActivate前にインスタンスの状態をロードする場合には,
これらのオブジェクト参照を再構築しなければならない。
セションコンテナは,非活性化されたセションインスタンスの状態を記憶するのに,
Javaプログラム言語の直列化プロトコルを使用する必要はないが,結果は等価にならなければならない。
ただし,活性化の間,コンテナがtransientフィールドの値をリセットする必要はない(注を参照。)。
エンタプライズBeanのフィールドを“transient”と宣言することは,一般的には,望ましくない。
このことは,コンテナが,インスタンス上でJavaプログラム言語に対応する実際の直列化プロトコルを実行せずに,
特殊化したJVMを使用して,インスタンスの状態をスワップアウト可能とすることに注意すること。
6.4.2 会話状態でのトランザクションロールバックの効果
セションBeanの会話状態は,トランザクション的ではない。Beanのトランザクションがロールバックしても,
セションBeanの会話状態は,自動的には初期状態にロールバックされない。
ロールバックによってセションBeanの会話状態が使用データベースの状態と矛盾する結果になる場合,Bean開発者は,
手動でその状態をリセットするために通知afterCompletionを使用しなければならない。
6.5 セションBeanとコンテナとの間のプロトコル
コンテナ自体は,セションBeansに実際のサービスを要求しない。コンテナが行うBean上の呼出しが,
Beanにコンテナサービスへのアクセスを提供し,コンテナが発行する通知を配布する。
6.5.1 必須インタフェースSessionBean
すべてのセションBeansは,インタフェースSessionBeanを実装しなければならない。
メソッドsetSessionContext()は,Beanのコンテナによって呼び出され,セションBeanインスタンスとコンテナが維持する文脈とを
関連付ける。通常,セションBeanは,セション文脈を会話状態の一部として保持する。
通知ejbRemoveは,インスタンスがコンテナによって除去される過程にあることを知らせる。
ほとんどのセションBeansは,清算するデータベース又は資源状態をもたないので,通常は,このメソッドは実装されない。
通知ejbPassivateは,コンテナの意図がインスタンスの非活性化にあることを知らせる。通知ejbActivateは,
ちょうど今,再活性化されたことをインスタンスに知らせる。コンテナは,非活性化の間,
セションBeanインスタンスの会話状態を自動的に維持するため,ほとんどのセションBeansは,これらの通知を無視することができる。
これらは,インスタンスの非活性化に先立って閉じられ,インスタンスの活性化の間に再び開かれる必要があるオープンされた資源を,
拡張Beansが維持できることを目的とする。
6.5.2 インタフェースSessionContext
すべてのBeanコンテナは,SessionContextをBeanインスタンスに提供する。これによって,Beanインスタンスは,
コンテナが維持するインスタンス文脈にアクセスできる。インタフェースSessionContextは,次のメソッドをもつ。
-
メソッドgetEJBObject()は,インスタンスのために,EJBオブジェクトを返す。
-
メソッドgetHome()は,インスタンスのEJBクラスのために,ホームインタフェースを返す。
-
メソッドgetEnvironment()は,Beanが配置された環境特性リストを返す。
-
メソッドgetCallerIdentity()は,BeanインスタンスのEJBオブジェクトの現在の起動者の識別子を返す。
-
述語isCallerRole()は,Bean呼出し者が役割をもつかどうかを示す。
-
メソッドsetRollbackOnly()によって,インスタンスは,現トランザクションを,
トランザクションの唯一の結果がロールバックとなるものとして印付けできる。
-
メソッドgetRollbackOnly()によって,インスタンスは,現トランザクションがロールバックと印付けされているかどうかを
検査できる。
-
メソッドgetUserTransaction()は,Beanが,明示的にトランザクションを区分する(注参照。)ために使用できるインタフェース
javax.jts.UserTransactionを返す。
コンテナは,インタフェースUserTransactionを,トランザクション属性TX_BEAN_MANAGED
をもって配置されたBeanでだけ利用可能とし、異なるトランザクション属性の値をもって配置されたBeanによって呼び出された場合には,
インタフェースgetUserTransactionは失敗することに注意すること。
6.5.3 選択的インタフェースSessionSynchronization
セションBeanは,インタフェースjavax.ejb.SessionSynchronizationを,選択的に実装できる。
このインタフェースは,Beanにトランザクション同期通知を提供する。セションBeansは,これらの通知を使用して,
トランザクション内にキャッシュされたデータベースデータを管理する。
通知afterBeginは,新しいトランザクションが開始したことをセションインスタンスに知らせる。
この時点で,インスタンスは,すでにトランザクション内に存在し, トランザクションの適用範囲内で要求されたデータベース作業をすべて実行してよい。
通知beforeCompletionは,セションインスタンスのクライアントが現トランザクション上での作業を完了した場合で,
インスタンスの資源をコミットする前に,発行される。この時,キャッシュされたデータベース更新を,すべて書き出すことが望ましい。
インスタンスは,セション文脈上でメソッドsetRollbackOnly()を呼び出すことによって,
トランザクションをロールバックすることができる。
通知afterCompletionは,現トランザクションが完了したことを知らせる。trueの完了状態は,
トランザクションがコミットしたことを示す。false状態は,ロールバックが発生したことを示す。
セションインスタンスの会話状態はトランザクション的ではないので,ロールバックが発生した場合,
手動でその状態をリセットする必要があるかもしれない。
6.5.4 業務メソッド委託
エンタプライズBeanの遠隔インタフェースは,クライアントが呼び出せる業務メソッドを定義する。
エンタプライズBeanの遠隔インタフェースは,コンテナツールが生成するEJBオブジェクトクラスによって実装される。
EJBオブジェクトクラスは,業務メソッドの呼出しを,エンタプライズBeanクラスにおいて一致する業務メソッドの実装に委託する。
6.5.5 セションBeanのメソッドejbCreate()
クライアントは,Beanのホームインタフェースで定義されるメソッドcreate()を使用して,セションBeanインスタンスを生成する。
Beanのホームインタフェースは,Bean開発者が提供する。つまり,その実装は,Beanのコンテナが生成する。
コンテナは,セションBeanのインスタンスを3段階で生成する。第1段階では,コンテナがBeanクラスのメソッドnewInstance()
を呼び出して,Beanインスタンスを生成する。第2段階では,コンテナがメソッドsetSessionContext()を呼び出して,
文脈オブジェクトをインスタンスに渡す。第3段階では,クライアントの呼び出すメソッドcreate()のシグネチャと
シグネチャが一致するインスタンスメソッドejbCreate()を,コンテナが呼び出す。クライアントから送信される入力パラメタは,
メソッドejbCreate()に渡される。
各セションBeanは,少なくとも一つのメソッドejbCreate()をもたなければならない。セションBeanのメソッドcreate()
の個数及びシグネチャは,各EJBクラスに固有とする。
セションBeanは,Beanとそのクライアントとの間で,固有の私的な会話を表現するので,その生成パラメタは,クライアントが
その使用に合わせてBeanインスタンスを個別化するための情報を含む。
6.5.6 セションBeanメソッドの直列化
コンテナは,各インスタンスへの呼出しを直列化する。ほとんどのコンテナが,Beanの多くのインスタンスの並行実行をサポートする。
しかし,各インスタンスには,メソッド呼出しの直列化された列だけが見える。そのため,セションBeanを再入可能にコード化しなくてよい。
コンテナが直列化するメソッド呼出しには,コンテナ自体が行うサービスコールバックだけでなく,
インスタンスのEJBオブジェクトを通じて配布されるメソッド呼出しを含む。例えば,コンテナは,
インスタンスが業務メソッドを実行する間,インスタンス上でメソッドejbPassivate()を呼び出してはならない。
この規則は,セションBeanインスタンスへの“ループバック”呼出しが文法に合わないことを意味する。
ループバック呼出しの例としては,クライアントがインスタンスAを呼び出す場合に,インスタンスAがインスタンスBを呼び出し,
BがAを呼び出す場合がある。BからAへのループバック呼出しを試みると,その結果として,コンテナは,Bに
java.rmi.RemoteExceptionを投げる。
6.5.7 セションBeanメソッドのトランザクション文脈
セションBeanのメソッドafterBegin()及びメソッドbeforeCompletion()は,Beanがトランザクション的な場合,
常に適正なトランザクション文脈で呼び出される。
セションBeanのメソッドnewInstance(),メソッドsetSessionContext(),メソッドejbCreate(),
メソッドejbRemote(),メソッドejbPassivate(),メソッドfinalize(),メソッドejbActivate(),
メソッドafterCompletion()などは,常にトランザクションなしで呼び出される。そのため,例えば,セションBeanのメソッド
ejbCreate()又はメソッドejbRemove()でデータベースを更新するのは,通常,誤りとなる。
セションBeanの配置記述子は,業務メソッドがトランザクション付きで呼び出されるかどうかを決定する。
6.6 状態付きセションBeanの状態図
図6.1は,状態付きセションBeanインスタンスのライフサイクルを示す。
 |
図6.1 状態付きセションBeanインスタンスのライフサイクル
状態付き及びトランザクション的なセションBeanインスタンスのライフサイクルは,次のとおりとする。
-
セションBeanは,クライアントがエンタプライズBeanのホームインタフェース上でメソッドcreate()を呼び出すときから始まる。
これによって,コンテナは,BeanクラスでnewInstance()を呼び出し,
エンタプライズBeanのために新しいメモリオブジェクトを生成する。次に,コンテナはインスタンス上で
setSessionContext()に続きejbCreate()を呼び出し,EJBオブジェクト参照をクライアントに返す。
インスタンスは,この時点で,メソッド動作可能状態になる。
-
Beanインスタンスは,この時点でクライアントの業務メソッドに対する準備が完了する。業務メソッドは,
エンタプライズBeanの配置記述子のトランザクション属性及びクライアントの呼出しに関連するトランザクション文脈に基づいて,
大域的トランザクション文脈で実行される場合も実行されない場合もある(図6.1では,メソッドtx()及び
メソッドnon-tx()として示す。)。11.に,コンテナがトランザクションを処理する方法を示す。
-
インスタンスがメソッド動作可能状態にある間は,非トランザクションメソッドが実行される。
-
トランザクションメソッドを呼び出すことによって,インスタンスは,トランザクション状態に入る。
Beanインスタンスがトランザクション状態に入ると,コンテナは,Beanインスタンス上でメソッドafterBegin()を発行する。
afterBegin()は,業務メソッドがトランザクションの一部として実行される前に,インスタンスに配布される。
インスタンスは,トランザクションと関連付けられ,トランザクションが完了するまで,トランザクションとの関連付けは保たれる。
-
このトランザクションにおいてクライアントが呼び出すBeanメソッドは,この時点で,Beanインスタンスに委託される。
クライアントが,Bean上でメソッドを呼び出そうとした場合であって,そのメソッドの配置記述子が,
現時点でインスタンスと関連付けられたものとは違うトランザクション文脈で,又は非トランザクション文脈で,
コンテナのメソッド呼出しを要求する場合には,誤りとなる。
-
トランザクションに実際にコミットする前に,トランザクションへのコミットが要求された場合には,
トランザクションサービスはコンテナに通知し,コンテナはインスタンス上でbeforeCompletionを発行する。
この時点で,インスタンスは,キャッシュした更新をすべてデータベースに書き込むほうがよい。
-
その後,トランザクションサービスはトランザクションにコミットしようとするが,その結果として,
コミット又はロールバックのいずれかが実行される。前段階でトランザクションロールバックが要求されていた場合は,
beforeCompletionを発行せずにロールバック状態に到達する。
-
トランザクションが完了すると,コンテナは,インスタンス上でafterCpmpletionを発行し,
完了の状態(コミット又はロールバック)を指定する。ロールバックが発生した場合,Beanインスタンスは会話状態をリセットして,
トランザクション開始時の値に戻す必要があるかもしれない。
-
コンテナのキャッシュアルゴリズムは,Beanインスタンスをメモリから除くものとして決定してよい。
これは,各メソッドの最後に実行されるか,又はLRU方式で実行される。コンテナは,インスタンス上でejbPassivate()を発行する。
この完了後,コンテナは,インスタンスの状態を2次記憶装置に保存しなければならない。セションBeanは,
(単一トランザクションではなく,)複数のトランザクション間でだけ,非活性化できる。
-
クライアントが非活性化されたセションBeanインスタンスを呼び出す場合,コンテナは,そのインスタンスを活性化する。
セションインスタンスを活性化するために,コンテナは,2次記憶装置からインスタンスの状態を復元し,ejbActivate()を発行する。
-
セションBeanは,再度クライアントメソッドに対する準備を完了する。
-
クライアントがEJBオブジェクト上でremove()を呼び出す場合,コンテナは,Beanインスタンス上でejbRemove()を発行する。
これによって,セションBeanインスタンスの一生が終了する。クライアントがインスタンスを引き続いて呼び出そうとする場合は,
javax.rmi.NoSuchObjectExceptionが投げられる(この例外は,java.rmi.RemoteExceptionのサブクラスとする。)。
コンテナがインスタンス上で暗黙的にメソッドremove()を呼び出すことができるのは,EJBオブジェクトの寿命が終了した後とする
ことに注意。インスタンスがトランザクションに関与している場合,メソッドremove()の呼出しはできない。
インスタンスがトランザクション状態にある間にセションインスタンスを除去しようとすると,その結果として,コンテナは,クライアントに
javax.ejb.RemoveExceptionを投げる。
6.6.1 トランザクションに対する制限
状態図は,クライアントが呼び出した業務メソッドのトランザクション範囲に,次の制限を課す。制限はコンテナによって実施され,
クライアントプログラマに見えなければならない。
-
セションBeanインスタンスが同時に参加できるのは,一度に多くとも一つのトランザクションとする。
-
セションBeanインスタンスがトランザクションに参加する場合,クライアントが異なるトランザクション文脈で,
又は非トランザクションの文脈で,セションBean上のメソッドを呼び出すことは,誤りとする。配置記述子が,
異なるトランザクション文脈で,又は非トランザクションの文脈で,コンテナにメソッドを実行させた場合には,
セションBean上のメソッド呼出しも同様に誤りとする。この場合,コンテナは,クライアントに
javax.rmi.RemoteExceptionを投げる。
-
セションBeanインスタンスがトランザクションに参加する場合,クライアントが,セションBean又はそのホームインタフェース上で,
メソッドremove()を呼び出すのは,誤りとする。コンテナは,こうした試行を検出し,クライアントに
javax.ejb.RemoveExceptionを投げなければならない。コンテナは,ロールバックのために,
クライアントのトランザクションを印付けしないほうがよい。これによって,クライアントは回復が可能となる。
6.7 状態付きセションBeanの系列図
6.7では,クラス間の相互作用を例示する系列図を示す。
6.7.1 注意事項
系列図には,“コンテナ提供クラス”というラベルの付いた箱がある。これは,コンテナの一部であるクラスか,
又はコンテナツールが生成したクラスかのいずれかとする。このクラスは,コンテナの実装に固有なプロトコルによって,
互いに通信する。そのために,このクラス間の通信は,図には示さない。
図示したクラスは,規定的な実装ではなく,説明的な実装と考えるほうがよい。
6.7.2 セションオブジェクトの生成
図6.2は,トランザクション的なセションエンタプライズBeanの生成を示す。
 |
図6.2 セションオブジェクトの生成
6.7.3 トランザクションの開始
図6.3は,トランザクション開始時に実行されるプロトコルを示す。
 |
図6.3 トランザクションの開始
6.7.4 トランザクションのコミット
図6.4は,セションエンタプライズBeanインスタンスに対応するトランザクションの同期プロトコルを示す。
 |
図6.4 トランザクションのコミット
6.7.5 トランザクション間のインスタンスの非活性化及び活性化
図6.5は,セションエンタプライズBeanインスタンスの非活性化及び再活性化を示す。
非活性化は,コンテナの要求に基づいて,自発的に発生する。活性化は,クライアントがメソッドを呼び出す場合に発生する。
 |
図6.5 トランザクション間のインスタンスの非活性化及び活性化
6.7.6 セションオブジェクトの除去
図6.6は,セションBeanの破壊を示す。
 |
図6.6 セションオブジェクトの破壊
6.8 無状態セションBeans
無状態セションBeansは,会話状態をもたないセションBeansとする。つまり,クライアントが呼び出すメソッドの提供に関与しない場合には,
各Beanインスタンスは同一となることを意味する。
無状態セションBeanのホームインタフェースは,セションBeanの遠隔インタフェースを返す引数のないメソッドcreate()
をもたなければならない。ホームインタフェースは,それ以外のメソッドcreate()をもってはならない。
セションエンタプライズBeanクラスは,単一のメソッドejbCreate()を定義しなければならない。
このメソッドejbCreate()は引数をもってはならない。
無状態セションBeanのインスタンスは,すべて等しいので,コンテナは,利用可能なインスタンスのいずれに対しても,
クライアントの作業を委託することを選択できる。
コンテナは,現在のクライアント負荷に必要とされる個数のインスタンスを保持するだけでよい。クライアントの“思考時間”のために,
通常は,この数は稼働中のクライアント数よりかなり少ない。非活性化は,無状態セションには必要ない。
クライアントの作業負荷が増大し,無状態セションBeanインスタンスが必要な場合は,コンテナがそれを生成する。
無状態セションBeanが,現クライアント作業負荷を処理する必要がない場合には,コンテナは,その無状態セションBeanを破壊できる。
無状態セションBeansは,コンテナの実装に依存して,多数のクライアントの支援に必要な資源を最小化するので,
この手法を使用するアプリケーションは,状態付きセションBeansを使用するアプリケーションよりは拡張性に富む。
この利点は,無状態Beansを使用するクライアントアプリケーションではその複雑度が増すので,相殺されるかもしれない。
クライアントは,無状態セションBeanのホームインタフェース上で,状態付きセションBeanと同様に,メソッドcreate()
及びメソッドremove()を使用する。クライアントは,自分がEJBインスタンスのライフサイクルを制御していると考えるが,
コンテナが,create()呼出し及びremove()呼出しを処理している。この場合,必ずしもEJBインスタンスを生成
及び除去する必要はない。
クライアントと無状態インスタンスとの間には,固定した対応づけは存在しない。コンテナは,クライアントの作業を,単に,
メソッドの準備が完了している利用可能な任意のインスタンスに委託する。
無状態セションは,インタフェースjavax.ejb.SessionSynchronizationを実装してはならない。
6.8.1 無状態セションBeanの状態図
クライアントが無状態セションBean参照の上でメソッドを呼び出す場合,コンテナは,
メソッドの準備が完了しているインスタンスのうちの一つを選び出し,メソッド呼出しを委託する。
図6.7は,無状態セションBeanインスタンスのライフサイクルを示す。
 |
図6.7 無状態セションBeanインスタンスのライフサイクル
セションBeanインスタンスのライフサイクルは,次のとおりとする。
-
無状態セションBeanは,コンテナが,Beanクラス上でnewInstance()を呼び出し,
エンタプライズBeanのための新しいメモリオブジェクトを生成した時から始まる。
次に,コンテナは,インスタンス上でsetSessionContext()に続いてejbCreate()を呼び出す。
コンテナは,いつでもインスタンス生成を実行できる。この場合,クライアントのメソッドcreate()
呼出しとは何の関係もない。
-
この時点で,Beanインスタンスはあらゆるクライアントからのメソッド呼出しの委託を受け入れる準備を完了する。
-
コンテナがインスタンスを必要としない場合,(通常は,コンテナがメソッド準備完了プール内のインスタンスの数を減少させたい場合に
発生するのだが,)コンテナは,インスタンス上でejbRemove()を呼び出す。これによって,
無状態セションBeanインスタンスの一生は終了する。
6.9 無状態セションBeanの系列図
6.9では,系列図によって,クラスの相互作用を図示する。
6.9.1 クライアント呼出しcreate()
図6.8は,無状態セションBeanが実装するEJBオブジェクトの生成を示す。
 |
図6.8 EJBオブジェクトの生成
6.9.2 業務メソッド呼出し
図6.9は,業務メソッドの呼出しを示す。
 |
図6.9 業務メソッドの呼出し
6.9.3 クライアント呼出しremove()
図6.10は,無状態セションBeanが実装するEJBオブジェクトの破壊を示す。
 |
図6.10 EJBオブジェクトの破壊
6.9.4 プールへのインスタンス付加
図6.11は,メソッド準備完了プールに,インスタンスを付加するコンテナの系列を示す。
 |
図6.11 メソッド準備完了プールへのインスタンスの追加
図6.12は,メソッド準備完了プールからインスタンスを除去するコンテナの系列を示す。
 |
図6.12 メソッド準備完了プールからのインスタンスの除去
6.10 エンタプライズBean提供者の責任
6.10では,エンタプライズBeanをすべてのEJBコンテナに確実に配置できるための,
セションエンタプライズBean提供者の責任を示す。
6.10.1 クラス及びインタフェース
エンタプライズBean提供者は,次のクラスファイルを提供する責任をもつ。
-
エンタプライズBeanクラス。
-
エンタプライズBeanの遠隔インタフェース。
-
エンタプライズBeanのホームインタフェース。
6.10.2 エンタプライズBeanクラス
セションエンタプライズBeanクラスの要件は,次のとおりとする。
-
クラスは,インタフェースjavax.ejb.SessionBeanを実装しなければならない。
-
クラスは,publicとして定義しなければならず,abstractであってはならない。
-
クラスは,エンタプライズBeanの遠隔インタフェースを実装してもよい。ただし,これは必須ではない。
参考:エンタプライズBeanクラスは,メソッド実引数又は結果として,不注意にthisを渡すのを避けるために,
遠隔インタフェースを実装しない方がよい。
-
クラスは,業務メソッド及びメソッドejbCreate()を実装しなければならない。
-
クラスは,インタフェースjavax.ejb.SessionSynchronizationを実装してもしなくてもよい。
6.10.3 メソッドejbCreate()
エンタプライズBeanクラスは,一つ以上のメソッドejbCreate()を定義しなければならない。
この場合,メソッドejbCreate()のシグネチャは,次の規則に従わなければならない。
-
メソッド名は,ejbCreateでなければならない。
-
メソッドは,publicとして宣言されなければならない。
-
返却値の型は,voidでなければならない。
-
メソッド実引数は,JavaRMIに対応した文法に合った型でなければならない。
-
throws節は,任意のアプリケーション固有の例外を定義してよい。
-
throws節は,java.rmi.RemoteExceptionを含んでよい。
-
throws節は,java.ejb.CreateExceptionを含んでよい。
6.10.4 業務メソッド
クラスは,ゼロ以上の業務メソッドを定義してよい。その場合,業務メソッドのシグネチャは次の規則に従わなければならない。
-
機能名は任意とできるが,EJB体系が定義するメソッドの名前(ejbCreate(),ejbActivate()など)
と同じになってはならない。
-
業務メソッドは,publicとして宣言されなければならない。
-
メソッド実引数及び返却値の型は,JavaRMIに対応した文法に合った型でなければならない。
-
throws節は,任意のアプリケーション固有の例外を定義してよい。
-
throws節は,java.rmi.RemoteExceptionを含んでよい。
6.10.5 エンタプライズBeanの遠隔インタフェース
エンタプライズBeanの遠隔インタフェースの要件は,次のとおりとする。
-
インタフェースは,インタフェースjavax.ejb.EJBObjectを拡張しなければならない。
-
このインタフェースで定義されるメソッドは,JavaRMIの規則に従わなければならない。
つまり,その実引数及び返却値は,JavaRMIに対応した妥当な型でなければならず,そのthrows節は,
java.rmi.RemoteExceptionを含まなければならない。
-
遠隔インタフェースで定義される各メソッドには,エンタプライズBean のクラスに一致するメソッドが存在しなければならない。一致するメソッドは,次をもたなければならない。
-
同じ名前。
-
同じ数及び同じ型の実引数,並びに同じ返却値の型。
-
エンタプライズBeanクラスの一致するメソッドのthrows節で定義される例外すべては,遠隔インタフェースのメソッドのthrows節で定義されなければならない。
6.10.6 エンタプライズBeanのホームインタフェース
エンタプライズBeanのホームインタフェースのシグネチャの要件は,次のとおりとする。
-
インタフェースは,インタフェースjavax.ejb.EJBHomeを拡張しなければならない。
-
このインタフェースで定義されるメソッドは,JavaRMIの規則に従わなければならない。
つまり,その実引数及び返却値は,JavaRMIに対応した妥当な型でなければならず,そのthrows節は,
java.rmi.RemoteExceptionを含まなければならない。
-
セションビーンのホームインタフェースは,一つ以上のメソッドcreate()を定義する。
-
これらのメソッドは,“create”と命名しなければならず,エンタプライズBeanクラスで定義されるメソッド
ejbCreate()の一つと一致しなければならない。一致するメソッドejbCreate()は,
同じ数及び同じ型の実引数をもたなければならない。ただし,返却値の型は異なることに注意。
-
メソッドcreate()に対応する返却値の型は,エンタプライズBeanの遠隔インタフェース型でなければならない。
-
エンタプライズBeanクラスのメソッドejbCreate()のthrows節で定義される例外すべては,
遠隔インタフェースの一致するメソッドcreate()のthrows節で定義されなければならない。
-
throws節は,javax.ejb.createException()を含まなければならない。
6.11 コンテナ提供者の責任
6.11では,セションBeanをサポートするコンテナ提供者の責任を示す。
6.11.1 実装クラスの生成
コンテナ提供者が提供するツールは,エンタプライズBeanの配置時に付加クラスを生成する責任をもつ。
ツールは,エンタプライズBean提供者が提供するクラス及びインタフェースを自己検査することによって,
Beanの配置記述子から得られる情報から,付加クラスの生成のために必要な情報を得る。
コンテナツールは,次のクラスを生成しなければならない。
-
エンタプライズBeanのホームインタフェースを実装するクラス(EJBホームクラス)。
-
エンタプライズBeanの遠隔インタフェースを実装するクラス(EJBオブジェクトクラス)。
コンテナツールは,コンテナ固有のコードとエンタプライズBeanクラスとを混合するクラスを生成してもよい。
例えば,コードは,コンテナを支援して実行時にBeanインスタンスを管理してもよい。
ツールは,サブクラス化,委託及びコード生成を使用できる。
コンテナのツールは,同様に,業務メソッドをラップし,業務論理を既存の操作環境へのカスタム化のために使用する
付加的なコードの生成を可能としてもよい。例えば,AccountManagerBean上の関数debit
に対応するラッパーは,借りた合計が一定限度を超えないことを検査してもよい。
6.11.2 EJBホームクラス
EJBホームクラスは,エンタプライズBeanのホームインタフェースを実装するコンテナの生成したクラスとする。
クラスは,インタフェースjavax.ejb.EJBHomeのメソッド及びエンタプライズBeanに固有のメソッドcreate()
を実装する。
各メソッドcreate()の実装は,一致するejbCreate()を呼び出す。
インタフェースjavax.ejb.EJBHomeで定義されるメソッドremove()の実装は,(インスタンスが
受動状態にある場合には,)インスタンスを活性化し,そのインスタンス上でメソッドejbRemove()
を呼び出さなければならない。
6.11.3 EJBオブジェクトクラス
EJBオブジェクトクラスは,エンタプライズBeanの遠隔インタフェースを実装するコンテナの生成したクラスとする。
EJBオブジェクトクラスは,インタフェースjavax.ejb.EJBObjectのメソッド及びエンタプライズBean
に固有の業務メソッドを実装する。
(インタフェースjavax.ejb.EJBObjectで定義される)メソッドremove()の実装は,(インスタンスが
受動状態にある場合には,)インスタンスを活性化し,インスタンス上でメソッドejbRemove()
を呼び出さなければならない。
各業務メソッドの実装は,(インスタンスが受動状態にある場合には,)インスタンスを活性化し,
インスタンス上で一致する業務メソッドを呼び出さなければならない。
6.11.4 ハンドルクラス
コンテナは,エンタプライズBeanに対応するハンドルクラスを実装する責任をもつ。
ハンドルクラスは,Javaプログラム言語の直列化プロトコルによって直列化可能でなければならない。
6.11.5 メタデータクラス
コンテナは,クライアントのビュー契約にメタデータを提供するクラスを実装する責任をもつ。
クラスは,妥当なRMIのクラスValueでなければならず,インタフェースjavax.ejb.EJBMetaData
を実装しなければならない。
6.11.6 再入不可能なインスタンス
コンテナは,確実に,一つのスレッドだけがいかなる時でも一つのインスタンスを実行可能としなければならない。
インスタンスが他の要求を実行している間に,クライアントの要求がインスタンスに到達した場合には,
コンテナは,2番目の要求にjava.rmi.RemoteExceptionを投げなければならない。
セションエンタプライズBeanは,ただ一つのクライアントだけのサポートを意図されていることに注意。
そのために,二つのクライアントが同じセションBeanを呼び出そうとした場合には,アプリケーションエラーとなる。
この規則は,アプリケーションがセションBeanインスタンスにループバック呼出しをできないことを意味する。
6.11.7 トランザクション適用範囲,セキュリティ及び例外
コンテナは,11.,14.及び12.でそれぞれ示す,トランザクション適用範囲, セキュリティ検査及び例外処理に関する規則に従わなければならない。
目次 | 前 | 次