目次 | 前
| 次
12. 例外処理
12.では例外処理の規則について記述する。
12.1 例外のクライアントのビュー
クライアントは,エンタプライズBeanの遠隔インタフェース及びホームインタフェースを通じてエンタプライズBeanをアクセスする。エンタプライズBeanの遠隔インタフェース及びホームインタフェースは,ともにJavaRMIインタフェースとする。そのため,これらのインターフェースのすべてのメソッドのthrows節は,必須のjava.rmi.RemoteExceptionを包含する。この例外は,システムレベル障害の表示としてクライアントに投げられる。
java.rmi.RemoteExceptionは,クライアントとコンテナとの通信サブシステム,コンテナ,又はエンタプライズBeanによって投げられる。コンテナは,クライアント呼出しをエンタプライズBeanに委託する際,予期しない状況のためクライアントの要求を完了できない場合には,この例外をクライアントに投げる。Beanは,この例外を投げ,データベースエラーなどのシステムレベルのエラーを表示する。
必須の例外java.rmi.RemoteExceptionに加え,メソッドのthrows節にはアプリケーション固有の例外をいくつでも包含してよい。エンタプライズBeanによってこれらの例外は投げられ,コンテナによる変更のないものがクライアントに渡される。
javax.ejb.CreateException,javax.ejb.RemoveException及びjavax.ejb.FindExceptionは標準アプリケーションレベルの例外であり,メソッドcreate,メソッドremove及びメソッドfinderからクライアントにエラーを報告する。
12.1.1 例外及びトランザクション
トランザクション適用範囲で実行するクライアントがエンタプライズBean業務メソッド,メソッドcreate,メソッドremove又はメソッドfinderを呼び出し,メソッドがjavax.jts.TransactionRolledbackException以外の例外で返す場合,クライアントは,トランザクションがロールバックに関して自動的にマークされなかったと推定できる。クライアントは,例えば,エンタプライズBeanメソッドを異なる仮引数で再度呼び出すか又は異なるエンタプライズBeanを呼び出すことによって,トランザクション復元を試みてもよい。
例外がjavax.jts.TransactionRolledbackExceptionである場合,クライアントはトランザクションがロールバックに関してマークされていると推定できる。トランザクションがコミットできないため,クライアントがトランザクションを続行することには意味がない。
クライアントが,javax.jts.TransacrionRolledbackException以外の例外java.rmi.RemoteExceptionを受取る場合(javax.jts.TransactionRolledbackExceptionはjava.rmi.RemoteExceptionのサブクラスであることに注意),一般にクライアントはエンタプライズBeanのメソッドが完了したかどうか分からない。そのため,トランザクションのクライアントが例外java.rmi.RemoteExceptionを受取る場合,クライアントは現トランザクションをロールバックして一貫性のないデータを防がなければならない。エキスパートレベルのクライアントだけが,トランザクション内でのjava.rmi.RemoteExceptionの復元を試みるべきとする。
別のエンタプライズBeanのクライアントでもあるエンタプライズBeanは,メソッドgetRollbackOnlyを使用して,現トランザクションがロールバックに関してマークされているかどうかをテストできる点に注意すること。
12.2 エンタプライズBean開発者に関する規則
12.2.1 アプリケーションレベルの例外
エンタプライズBeanの業務メソッド,メソッドejbCreate,メソッドejbRemove及びメソッドejbFind<METHOD>のthrows節は,任意のアプリケーションレベルの例外を包含してもよい。
javax.ejb.CreateException,javax.ejb.RemoveException及びjavax.ejb.FindExceptionは同様にアプリケーションレベルの例外と考えられ,エンタプライズBeanクラスの生成メソッド,除去メソッド及びファインダメソッドのthrows節で使用してよい。
アプリケーションレベルの例外は,クライアントに投げられ,アプリケーション固有のエラー条件を表示する。アプリケーション固有のエラー条件とは,例えば,小切手口座の銀行側の払戻し制限を越えたり,二重口座を作成しようとすることとする。
エンタプライズBean開発者は,コンテナがこれらの例外を未変更のままクライアントに渡すと推定してよい。
12.2 システムレベルの例外
エンタプライズBean開発者は,メソッド(業務メソッド,メソッドejbCreate,メソッドejbRemove及び他のコンテナコールバックメソッドすべて)からjava.rmi.RemoteExceptionを投げ,予期しないシステムレベル障害(データベース接続を開く障害など)を表示しなければならない。
EJB1.0は,Beanインスタンスがコンテナに投げることができるシステムレベルの例外を標準化していない。
12.3 ロールバックに関するトランザクションマーク
エンタプライズBean開発者は,Beanが例外を投げる場合,コンテナは自動的にクライアントのトランザクションをロールバックしないと推定しなければならない(これはアプリケーションにもシステムレベルの例外にも適用される)。そのため,エンタプライズBean開発者は,例外を投げる前に一貫性のある状態となることを確実にしなければならない。
Beanが例外を投げる時点で一貫性のある状態がない可能性がある場合,BeanはインタフェースEJBContext上でメソッドsetRolledbackOnlyを使用して,例外を投げる前にロールバックに関してトランザクションをマークしなければならない。この機構によって,Beanは,トランザクションがロールバックすべきか否かを明示的に決定することができる。
12.3 コンテナ提供者に関する規則
コンテナは,エンタプライズBeanのメソッドが投げた例外を次に示すとおり処理しなければならない。
12.3.1 アプリケーションレベルの例外
コンテナは,エンタプライズBeanの業務メソッド,メソッドejbCreate,メソッドejbPostCreate,メソッドejbRemove及びメソッドejbFind<METHOD>が投げたすべてのアプリケーションレベルの例外(java.rmi.RemoteException以外のメソッドのthrows節で定義されたすべての例外)をクライアントに渡さなければならない。これは,例えばコンテナは,アプリケーションレベルの例外をjava.rmi.RemoteExceptionに変更してはならないことを意味する。
12.3.2 システムレベルの例外
コンテナは,エンタプライズBeanのメソッドが投げた例外java.rmi.RemoteExceptionをすべて捕捉しなければならない。コンテナは,例外を記録し,問題をシステム管理者に知らせなければならない。エラーのためクライアントの要求を上手く完了できない場合,コンテナはクライアントにjava.rmi.RemoteExceptionを投げなければならない。コンテナは,最初にBeanが投げた例外を再度投げるか,又は異なる例外を投げるかもしれない。この場合の異なる例外は,java.rmi.RemoteException又はそのサブクラスでなければならない。
12.3.3 未検査の例外
コンテナは,エンタプライズBeanのメソッドが投げる未検査の例外をすべて捕捉しなければならない。コンテナは,例外を記録し,クライアントにjava.rmi.RemoteExceptionを投げなければならない。コンテナは,インスタンスが未定義の状態にあると推定し,それ以上の要求にインスタンスを使用してはならない。インスタンスがトランザクションに関与した場合,コンテナは,トランザクションをロールバックするか,又はロールバックに関してトランザクションをマークしなければならない。
12.3.4 例外及びトランザクション
一般に,エンタプライズBeanメソッドが投げた検査済み例外(アプリケーションレベルの例外及びシステムレベルの例外を含む)によって,コンテナは自動的にトランザクションをロールバックしたり,ロールバックに関してトランザクションをマークしてはならない。これによって,クライアントは例外からの復元が可能になる。
コンテナは,ロールバックに関してトランザクションをマークするあらゆる理由についての判断を下す場合,javax.jts.TransactionRolledbackExceptionをクライアントに投げなければならない。javax.jts.TransactionRolledbackExceptionは,java.rmi.RemoteExceptionのサブクラスであり,トランザクションがコミットできないためにトランザクション内の例外を復元しようとしても無意味であることをクライアントに知らせる。
インスタンスメソッド実行の結果が例外になった後で,コンテナにトランザクションのロールバックを要求するケースは四つある。
-
例外を投げたエンタプライズBeanのメソッドが,メソッドのディスパッチ前にコンテナが自動的に起動したトランザクションで実行した場合(コンテナがエンタプライズBeanのメソッドを呼び出す前にトランザクションを自動的に起動する場合については,11.4で説明している),コンテナはトランザクションをロールバックしなければならず,その場合,コンテナは,クライアントに例外を投げる前に(クライアントに投げられる例外は,12.2の規則を使用してコミットされる),エンタプライズBeanのメソッドからアプリケーションレベルの例外を含むあらゆる例外をとらえる。クライアントがトランザクションと関連づけられる場合,クライアントのトランザクションは,異なるトランザクションでインスタンスが実行したため,ロールバックに関してマークされない(このケースが生じるのは,Beanがトランザクション属性TX_REQUIRES_NEWで配置される場合のみである点に注意すること)。
-
TX_BEAN_MANAGED実体ビーンのインスタンス又は無状態セションビーンのインスタンスが,インスタンスとトランザクションとが関連づけられている間に例外を投げる場合,コンテナは,適正な例外をクライアントに投げる前にトランザクションをロールバックしなければならない。
-
インスタンスがクライアントのトランザクション文脈での実行中に未検査の例外を投げた場合,コンテナは,ロールバックに関するトランザクションをマークし,クライアントにjavax.jts.TransactionRolledbackExceptionを投げなければならない。
-
TX_BEAN_MANAGEDビーンインスタンスが,インスタンスとトランザクションとが関連づけられている間に未検査の例外を投げる場合,コンテナは,トランザクションをロールバックし,クライアントにjavax.jts.RemoteExceptionを投げなければならない。
目次 | 前 |
次