ビジネスクラスが再試行される場合でも、再試行前にビジネスクラスが実行した処理は取り消されません。このため、ビジネスクラス再試行機能を使用する場合は、以下の点に注意してビジネスクラスを作成してください。
ビジネスメソッドでEJBを呼び出す場合の注意事項
ビジネスメソッドで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に変更を加える場合は、再試行例外が発生する処理が完了したあとでデータ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; } ... }
setResponseBeanメソッド使用時の注意事項
com.fujitsu.uji.DispatchContextクラスのsetResponseBeanメソッドを実行したあとでは、再試行例外を発生させないでください。また、setRetry(true)を実行した場合はsetResponseBeanを実行しないでください。 setResponseBeanを実行後に再試行した場合、再試行前のsetResponseBeanの処理は取り消されません。