Apcoordinator ユーザーズガイド |
目次 |
第2部 Apcoordinatorコアの機能 | > 第7章 EJBの呼び出し | > 7.6 EJBの再試行 |
セションBeanが再試行例外を発生して再試行される場合でも、再試行例外を発生する前にセションBeanが実行した処理は取り消されません。 このため、EJB再試行機能で呼び出されるセションBeanは、以下の点に注意して作成してください。
セションBeanの処理でトランザクションを必要とする場合は、再試行例外を発生させる前にトランザクションをロールバックしてください。 セションBeanで開始したトランザクションや、セションBeanから呼び出された処理で開始されたトランザクションがすでにコミットされている場合、その処理は取り消せないため、再試行例外を発生させないでください。
また、上記のようにコミット、ロールバックをセションBeanで実行する場合は、 セションBeanの呼び出し元が開始したトランザクションにセションBeanが参加することはできません。
通常は、EJBの呼び出しにおいては引数は値渡しで呼び出されます。
このため、Call
インタフェースを使ってセションBeanを呼び出すと、invoke
メソッドの引数に与えたデータBeanのコピーがセションBeanに渡されます。
ただし、アプリケーションサーバによっては、クライアントとEJBが同一のJVM上に存在する場合に、
EJB呼び出しの性能を向上させる目的で、引数の参照渡しを可能にしている場合があります。
引数の参照渡しを有効にした場合、Call
インタフェースのinvoke
に与えたデータBeanのインスタンスそのものがセションBeanに渡されます。データBeanはコピーされません。
引数の参照渡しを有効にする場合は、ビジネスクラスの引数に与えられたデータBeanをビジネスクラスの処理で変更しないでください。 データBeanに変更を加えると、再試行によって呼び出された時に、変更後のデータBeanがビジネスクラスの引数に与えられます。
以下のクラスのオブジェクトは、セションBeanの呼び出しが終了した後も生存しています。これらのオブジェクトが持つデータを変更した後で再試行例外を発生させた場合、再試行によってセションBeanが呼び出された時点で、オブジェクトが持つデータは変更後の状態のままになっています。
init
メソッドがtrue
を返す場合)
再試行前のデータ変更が再試行後に残っていることが問題となる場合は、再試行例外が発生する処理が完了した後で ビジネスクラス、セションクラス、アプリケーションクラスのデータを変更する処理を実行してください。
目次 |