Apcoordinator ユーザーズガイド |
目次 |
第2部 Apcoordinatorコアの機能 | > 第4章 APIを使ったプログラミング | > 4.7 ビジネスクラスの再試行 |
ビジネスクラスが再試行される場合でも、再試行前にビジネスクラスが実行した処理は取り消されません。 このため、ビジネスクラス再試行機能を使用する場合は、以下の点に注意してビジネスクラスを作成してください。
ビジネスメソッドで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
の処理は取り消されません。
目次 |