| Apcoordinator ユーザーズガイド |
目次
![]()
|
| 第2部 Apcoordinatorコアの機能 | > 第4章 APIを使ったプログラミング | > 4.6 ビジネスクラスの再試行 |
ビジネスクラスが再試行される場合でも、再試行前にビジネスクラスが実行した処理は取り消されません。 このため、ビジネスクラス再試行機能を使用する場合は、以下の点に注意してビジネスクラスを作成してください。
ビジネスメソッドでEJBセションBeanのオブジェクトを作成している場合、再試行前にEJBセションBeanのオブジェクトを削除するようにプログラムしてください。
com.fujitsu.uji.ext.CallFactoryインタフェースのcreateCallメソッド、または、com.fujitsu.uji.ejb.EJBCallFactoryクラスのcreateUjiSessionCallメソッドを使ってEJBセションBeanのオブジェクトを作成した場合は、
com.fujitsu.uji.ejb.UjiSessionCallインタフェースのremoveメソッドによりEJBセションBeanのオブジェクトが削除されます。createCallによって取得したCallインタフェースの場合は、UjiSessionCallにキャストしてremoveを実行してください。
ビジネスメソッドでEJBセションBeanのオブジェクトを作成し、再試行前に削除しなかった場合、そのオブジェクトが再試行後も残存します。
ビジネスメソッドの引数に与えられたデータBeanに変更を加える場合は、
再試行例外が発生する処理が完了したあとでデータBeanに変更を加えてください。
また、setRetry(true)を実行する場合は、データBeanに変更を加えないでください。
データBeanに変更が加えられたあとで再試行した場合、再試行によってビジネスメソッドが呼び出された時点で、変更後のデータBeanがビジネスメソッドの引数に与えられます。
以下のクラスのオブジェクトは、ビジネスクラスの呼び出しが終了したあとも生存しています。これらのオブジェクトが持つデータを変更したあとで再試行した場合、 再試行によってビジネスメソッドが呼び出された時点で、オブジェクトが持つデータは変更後の状態のままになっています。
initメソッドがtrueを返す場合)
再試行前のデータ変更が再試行後に残っていることが問題となる場合は、再試行例外が発生する処理が完了したあとで
ビジネスクラス、セションクラス、アプリケーションクラスのデータを変更してください。また、setRetry(true)を実行した場合はビジネスクラス、セションクラス、アプリケーションクラスのデータを変更しないでください。
以下に、再試行例外が発生する処理が完了したあとでビジネスクラス、セションクラス、アプリケーションクラスのデータを変更するプログラムの概略を示します。
import com.fujitsu.uji.DispatchContext; import com.fujitsu.uji.GenericRetriableHandler; ... public class SomeHandler extends GenericRetriableHandler { public boolean init() { return true; } public Object doSomething(DispatchContext context, SomeBean dataBean) throws MyException { // 以下のtryからcatchまでの処理で例外が発生した場合は、 // 再試行例外MyExceptionを発生させるようにプログラムしています。 // この範囲では、ビジネスクラス、セションクラス、アプリケーション // クラスのデータを変更しないようにします。 try { ... } catch (Exception e) { throw new MyException(e.getMessage(),e); } // これ以降は再試行例外が発生しません。 // ビジネスクラス、セションクラス、アプリケーションクラスのデータの // 変更や、ビジネスメソッドの引数のデータBeanの変更はこの段階で行い // ます。 ... return dataBean; } ... }
com.fujitsu.uji.DispatchContextクラスのsetResponseBeanメソッドを実行したあとでは、再試行例外を発生させないでください。
また、setRetry(true)を実行した場合はsetResponseBeanを実行しないでください。
setResponseBeanを実行後に再試行した場合、再試行前のsetResponseBeanの処理は取り消されません。
目次
![]()
|