9.4. トランザクション伝播ポリシー
トランザクションクライアントが新しいトランザクションを作成する方法に影響を与える場合は、JmsTransactionManager
を使用してそのトランザクションポリシーを指定できます。特に、Spring トランザクションポリシーを使用すると、トランザクションの伝播動作を指定できます。たとえば、トランザクションクライアントが新しいトランザクションを作成しようとしていて、トランザクションが現在のスレッドにすでに関連付けられていることを検知した場合に、そのまま新しいトランザクションを作成して、古いトランザクションを一時停止するべきですか ?また、既存のトランザクションに引き継がせる必要がありますか。これらの種類の動作は、トランザクションポリシーで伝播動作を指定することによって規制されます。
トランザクションポリシーは、Blueprint XML で Bean としてインスタンス化されます。その後、その Bean ID
を transacted()
DSL コマンドに引数として指定すると、トランザクションポリシーを参照できます。たとえば、動作 PROPAGATION_REQUIRES_NEW
の対象となるトランザクションを開始する場合は、次のルートを使用できます。
from("file:src/data?noop=true") .transacted("PROPAGATION_REQUIRES_NEW") .bean("accountService","credit") .bean("accountService","debit") .to("file:target/messages");
PROPAGATION_REQUIRES_NEW
引数は、PROPAGATION_REQUIRES_NEW
動作で設定されるトランザクションポリシー Bean の Bean ID
を指定します。「Blueprint XML でのポリシー Bean の定義」を参照してください。
9.4.1. Spring トランザクションポリシー
Apache Camel では、org.apache.camel.spring.spi.SpringTransactionPolicy
クラスを使用して Spring トランザクションポリシーを定義できます。これは基本的にネイティブ Spring クラスのラッパーです。SpringTransactionPolicy
クラスは以下の 2 つのデータをカプセル化します。
-
PlatformTransactionManager
タイプのトランザクションマネージャーへの参照 - 伝播動作
たとえば、以下のように PROPAGATION_MANDATORY
動作で Spring トランザクションポリシー Bean をインスタンス化できます。
<blueprint ...> <bean id="PROPAGATION_MANDATORY "class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY" /> </bean> ... </blueprint>
9.4.2. 伝播動作の説明
Spring では、以下の伝播動作がサポートされます。これらの値は当初、JavaeEE でサポートされる伝搬動作でモデル化されました。
- PROPAGATION_MANDATORY
- 現在のトランザクションをサポートします。現在のトランザクションが存在しない場合は例外が発生します。
- PROPAGATION_NESTED
現在のトランザクションが存在する場合はネストされたトランザクション内で実行し、それ以外の場合は
PROPAGATION_REQUIRED
のように動作します。注記ネストされたトランザクションは、すべてのトランザクションマネージャーでサポートされているわけではありません。
- PROPAGATION_NEVER
- 現在のトランザクションはサポートしません。現在のトランザクションが存在する場合は例外が発生します。
- PROPAGATION_NOT_SUPPORTED
現在のトランザクションはサポートしません。常に非トランザクションを実行します。
注記このポリシーでは、現在のトランザクションを一時停止する必要があります。これは、すべてのトランザクションマネージャーでサポートされているわけではありません。
- PROPAGATION_REQUIRED
- (デフォルト) 現在のトランザクションをサポートします。存在しない場合は、新しいトランザクションを作成します。
- PROPAGATION_REQUIRES_NEW
新しいトランザクションを作成し、現在のトランザクションが存在する場合はそれを一時停止します。
注記トランザクションの一時停止は、すべてのトランザクションマネージャーでサポートされているわけではありません。
- PROPAGATION_SUPPORTS
- 現在のトランザクションをサポートします。トランザクションが存在しない場合は、非トランザクションを実行します。
9.4.3. Blueprint XML でのポリシー Bean の定義
以下の例は、サポートされるすべての伝播動作に対してトランザクションポリシー Bean を定義する方法を示しています。便宜上、各 Bean ID は、伝播動作値で指定された値と同じですが、実際には、BeanID に任意の値を使用できます。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bean id="PROPAGATION_MANDATORY " class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY" /> </bean> <bean id="PROPAGATION_NESTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_NESTED" /> </bean> <bean id="PROPAGATION_NEVER" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_NEVER" /> </bean> <bean id="PROPAGATION_NOT_SUPPORTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_NOT_SUPPORTED" /> </bean> <!-- This is the default behavior. --> <bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> </bean> <bean id="PROPAGATION_REQUIRES_NEW" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW" /> </bean> <bean id="PROPAGATION_SUPPORTS" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_SUPPORTS" /> </bean> </blueprint>
これらの bean 定義のいずれかを独自の Blueprint XML 設定に貼り付ける場合は、必ずトランザクションマネージャーへの参照をカスタマイズするようにしてください。つまり、txManager
への参照をトランザクションマネージャー Bean の実際の ID
に置き換えます。
9.4.4. Java DSL の PROPAGATION_NEVER
ポリシーを使用したルートの例
トランザクションポリシーがトランザクションに何らかの影響を与えることを示す簡単な方法は、次のルートに示すように、既存のトランザクションの途中に PROPAGATION_NEVER
ポリシーを挿入することです。
from("file:src/data?noop=true") .transacted() .bean("accountService","credit") .transacted("PROPAGATION_NEVER") .bean("accountService","debit");
このように使用すると、PROPAGATION_NEVER
ポリシーはすべてのトランザクションを必然的に中止し、トランザクションのロールバックにつながります。アプリケーションへの影響を簡単に確認できるはずです。
transacted()
に渡される文字列の値は Bean ID
で、伝播の動作名ではないことに注意してください。この例では、Bean ID
が伝播動作名と同じになるように選択されますが、必ずしもそうである必要はありません。たとえば、アプリケーションで複数のトランザクションマネージャーを使用している場合、特定の伝播動作を持つ複数のポリシー Bean が作成される可能性があります。この場合、伝播の動作の後に Bean の名前を付けることはできませんでした。
9.4.5. Blueprint XML で PROPAGATION_NEVER
ポリシーを使用したルートの例
上記のルートは、以下のように Blueprint XML で定義できます。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route> <from uri="file:src/data?noop=true" /> <transacted /> <bean ref="accountService" method="credit" /> <transacted ref="PROPAGATION_NEVER" /> <bean ref="accountService" method="debit" /> </route> </camelContext> </blueprint>