トランザクション管理機能とビジネスクラス再試行機能の両方を使用するには、com.fujitsu.uji.transaction.TransactionHandlerインターフェイスとcom.fujitsu.uji.RetriableHandlerインターフェイスを実装してビジネスクラスを作成します。 簡単に作成したい場合は、com.fujitsu.uji.transaction.RetriableTransactionHandlerクラスを継承して作成します。RetriableTransactionHandlerクラスはTransactionHandlerインターフェイスとRetriableHandlerインターフェイスの簡単な実装を提供します。
ビジネスクラス設定ファイル(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"> <method name="doUpdate"> <transaction enabled="true"/> <!-- (1) --> <retry enabled="true" retryInterval="200" retryCount="1" /> <!-- (2) --> </method> <method name="search"> <retry enabled="true" retryInterval="200" retryCount="1" /> <!-- (3) --> </method> <method name="*"> <transaction enabled="false"/> <!-- (4) --> <retry enabled="false"/> <!-- (5) --> </method> </handler> </handlerConfig>
この記述例による設定内容は以下のとおりです。
sample.SampleHandlerクラスのdoUpdateメソッドでは、(1), (2)の指定により、トランザクション管理機能とビジネスクラス再試行機能の両方が有効です。
sample.SampleHandlerクラスのsearchメソッドでは、(3)の指定により、ビジネスクラス再試行機能は有効です。トランザクション管理機能についての指定はないため、(4)で指定されたデフォルトの定義に従い、トランザクション管理機能は無効になります。
sample.SampleHandlerクラスのその他のメソッドでは、(4), (5)の指定によりトランザクション管理機能、ビジネスクラス再試行機能の両方とも無効です。
トランザクション管理機能とビジネスクラス再試行機能を併用した場合、ビジネスクラス再試行機能とトランザクション管理機能が連動して動作します。再試行が行われる場合は、再試行直前にトランザクションがロールバックされ、再度トランザクションが開始されます。
また、ビジネスクラスのメソッドは以下の順序で呼び出されます。再試行される場合は、afterTransactionCompletionまで実行されたあとに再試行され、beforeTransactionBeginから再度実行されます。
ビジネスクラスがcom.fujitsu.uji.Postprocessorインターフェイスを実装している場合は、postprocessメソッドとhandleExceptionメソッドのどちらか一方が呼び出されます。handleExceptionが呼ばれるのは以下の場合です。それ以外はpostprocessが呼び出されます。
beforeTransactionBeginまたはトランザクション開始処理で例外が発生した場合。
ビジネスメソッドが例外を発生したが、再試行は行われなかった場合。以下の場合が該当します。
発生した例外が再試行例外でない場合。
例外発生後、beforeMethodCompletionでsetRetry(false)が実行された場合。
再試行最大回数を超える場合。
ビジネスメソッドは正常終了し、かつ、setRetry(true)が実行され、かつ、再試行最大回数を超えるため再試行できない場合。この場合、com.fujitsu.uji.RetryCountExpiredExceptionがhandleExceptionに通知されます。
preprocess、beforeTransactionBegin、トランザクション開始処理で発生した例外は、handleExceptionに通知されません。
preprocess、beforeTransactionBegin、トランザクション開始処理で例外が発生した場合、後続の処理の一部はスキップされます。例外の発生個所とスキップされる処理の関係を以下の表に示します。
例外を発生する処理 | 後続の処理の実行有無 | |||||||
---|---|---|---|---|---|---|---|---|
before | トランザクション開始 | ビジネスメソッド | before | before | トランザクション終了 | after | handle | |
preprocess | × | × | × | × | × | × | × | ×(*2) |
beforeTransactionBegin | - | × | × | × | × | × | × | ○ |
トランザクション開始 | - | - | × | ○ | × | × | ○ | ○ |
○: 実行されます。
×: 実行されません。
-: 後続の処理に該当しません。
(*1) ビジネスクラスがPostprocessorインターフェイスを実装している場合に呼び出されます。
(*2) handleException, postprocessのどちらも呼び出されません。