ビジネスクラス再試行機能を使用するには、com.fujitsu.uji.RetriableHandler インターフェイスを実装してビジネスクラスを作成します。 簡単に作成するにはcom.fujitsu.uji.GenericRetriableHandlerクラスを継承して作成します。GenericRetriableHandlerクラスはRetriableHandlerインターフェイスの簡単な実装を提供します。
デフォルトでは再試行に関する設定は以下のとおりになります。
RetriableHandlerを実装したビジネスクラスのビジネスメソッド全てで再試行が有効
再試行間隔は100ミリ秒
再試行最大回数は2回 (初回の実行を合わせると最大で合計3回実行します)
コマンドマップで指定したメソッドの終了後に再試行の有無を決定する
コマンドマップで指定したメソッドの終了後に、ビジネスクラスやセションクラスの持つデータを参照して再試行の有無を決定したい場合は、ビジネスクラスの beforeMethodCompletionメソッドにその処理を記述します。 beforeMethodCompletionメソッドは、コマンドマップで指定したメソッドの終了後に呼び出されます。
beforeMethodCompletionメソッドで再試行を指示するには、com.fujitsu.uji.DispatchContextクラスのsetRetryメソッドを呼び出します。引数にはtrueを指定します。すでに予定されている再試行を取り消すには、引数にfalseを指定してsetRetryメソッドを呼び出します。
再試行が予定されているかどうかは、DispatchContextクラスのgetRetryメソッドで取得できます。例外の発生などにより再試行の条件が満たされている場合は、再試行が予定されています。この場合、getRetryメソッドがtrueを返します。
ビジネスメソッドごとに再試行の動作を設定する
再試行の有無、再試行間隔、再試行最大回数をビジネスメソッドごとに指定するには、設定ファイルフォルダにビジネスクラス設定ファイル(handlerconfig.xml)を作成して設定を記述します。
以下は、ビジネスクラス設定ファイル(handlerconfig.xml)の記述例です。
<?xml version="1.0" encoding="Shift_JIS"?> <handlerConfig xmlns=http://interstage.fujitsu.com/schemas/uji/handlerConfig xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/handlerConfig http://interstage.fujitsu.com/schemas/uji/handlerconfig.xsd"> <config> <version>6.0</version> </config> <handler name="sample.SampleHandler"> <!-- (1) --> <method name="doUpdate"> <!-- (2) --> <retry enabled="true" retryInterval="200" retryCount="1" /> <!-- (3) --> </method> <method name="*"> <!-- (4) --> <retry enabled="false"/> <!-- (5) --> </method> </handler> </handlerConfig>
(1) handlerタグでビジネスクラス1個についての設定を記述します。nameアトリビュートにビジネスクラスのクラス名をパッケージ名付きで記述します。
(2) (1)のビジネスクラスの各ビジネスメソッドの設定をmethodタグで記述します。nameアトリビュートにメソッド名を記述します。methodタグはhandlerタグのコンテントに必要なだけ繰り返して記述します。
(3) (2)のビジネスメソッドの設定をretryタグで記述します。retryタグはmethodタグのコンテントに1個だけ記述します。retryタグには以下のアトリビュートを指定します。
enabled
再試行を有効にするかどうかを指定します。trueを指定すると(2)のビジネスメソッドでビジネスクラス再試行機能が有効に、falseを指定すると無効になります。このアトリビュートを省略した場合はtrueです。
retryInterval
再試行間隔をミリ秒単位で指定します。このアトリビュートを省略した場合、再試行間隔は100ミリ秒です。
retryCount
再試行最大回数を指定します。例えば、2を指定すると、初回の実行と合わせて最大で合計3回メソッドを実行します。このアトリビュートを省略した場合、再試行最大回数は2です。
(4),(5) methodタグにname="*"を指定すると、デフォルトの設定を定義できます。このデフォルトの設定は、対応するmethodタグがないビジネスメソッドや、methodタグは存在してもretryタグが省略されている場合に適用されます。
上記の記述例では、sample.SampleHandlerクラスのdoUpdateメソッドではビジネスクラス再試行機能が有効で、その他のビジネスメソッドでは無効になります。
注意
再試行間隔の精度はご使用になるシステムに依存します。 10ミリ秒より高い精度による指定はシステムによっては有効にならない場合があります。
メソッドの実行順序
ビジネスクラス再試行機能を使用した場合、ビジネスクラスのメソッドは以下の順序で呼び出されます。
ビジネスクラスがcom.fujitsu.uji.Postprocessorインターフェイスを実装している場合は、postprocessメソッドとhandleExceptionメソッドのどちらか一方が呼び出されます。handleExceptionが呼ばれるのは以下の場合です。それ以外はpostprocessが呼び出されます。
ビジネスメソッドが例外を発生したが、再試行は行われなかった場合。以下の場合が該当します。
発生した例外が再試行例外でない場合。
例外発生後、beforeMethodCompletionメソッドでsetRetry(false)が実行された場合。
再試行最大回数を超える場合。
ビジネスメソッドは正常終了し、かつ、setRetry(true)が実行され、かつ、再試行最大回数を超えるため再試行できない場合。この場合、com.fujitsu.uji.RetryCountExpiredExceptionがhandleExceptionに通知されます。
beforeMethodCompletionで発生した例外は、handleExceptionには通知されません。
注意
ビジネスクラスがRetriableHandlerインターフェイスを実装していても、ビジネスクラス設定ファイルでビジネスクラス再試行機能が無効に設定されている場合は、beforeMethodCompletionメソッドは呼び出されません。