14.4. JMS トランザクションの設定
概要
CXF 3.0 は、一方向メッセージングを使用する場合、CXF エンドポイントでローカル JMS トランザクションと JTA トランザクションの両方をサポートします。
ローカルトランザクション
ローカルリソースを使用するトランザクションは、例外が発生した場合にのみ JMS メッセージをロールバックします。データベーストランザクションなどの他のリソースを直接調整することはありません。
ローカルトランザクションを設定するには、通常通りにエンドポイントを設定し、sessionTrasnsacted
プロパティーを true
に設定します。
トランザクションとプーリングの詳細は、Red Hat JBoss Fuse トランザクションガイド を参照してください。
JTA トランザクション
JTA トランザクションを使用すると、任意の数の XA リソースを調整できます。CXF エンドポイントが JTA トランザクション用に設定されている場合、サービス実装を呼び出す前にトランザクションを開始します。例外が発生しなければ、トランザクションはコミットされます。それ以外の場合は、ロールバックされます。
JTA トランザクションでは、JMS メッセージが消費され、データがデータベースに書き込まれます。例外が発生すると、両方のリソースがロールバックされるため、メッセージが消費されてデータがデータベースに書き込まれるか、メッセージがロールバックされてデータがデータベースに書き込まれません。
JTA トランザクションの設定には、次の 2 つの手順が必要です。
トランザクションマネージャーの定義
Bean メソッド
トランザクションマネージャーの定義
<bean id="transactionManager" class="org.apache.geronimo.transaction.manager.GeronimoTransactionManager"/>
JMS URI でトランザクションマネージャーの名前を設定します
jms:queue:myqueue?jndiTransactionManager=TransactionManager
この例では、ID
TransactionManager
の Bean を検索します。
OSGi 参照方法
ブループリントを使用して、トランザクションマネージャーを OSGi サービスとして検索します
<reference id="TransactionManager" interface="javax.transaction.TransactionManager"/>
JMS URI でトランザクションマネージャーの名前を設定します
jms:jndi:myqueue?jndiTransactionManager=java:comp/env/TransactionManager
この例では、JNDI でトランザクションマネージャーを検索します。
JCA プール接続ファクトリーの設定
Spring を使用して JCA プールされた接続ファクトリーを定義します。
<bean id="xacf" class="org.apache.activemq.ActiveMQXAConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /> </bean> <bean id="ConnectionFactory" class="org.apache.activemq.jms.pool.JcaPooledConnectionFactory"> <property name="transactionManager" ref="transactionManager" /> <property name="connectionFactory" ref="xacf" /> </bean>
この例では、最初の Bean は
JcaPooledConnectionFactory
に指定される ActiveMQ XA 接続ファクトリーを定義します。JcaPooledConnectionFactory
は idConnectionFactory
のデフォルトの Bean として提供されます。JcaPooledConnectionFactory
は通常の ConnectionFactory のようになることに注意してください。ただし、新しい接続とセッションが開かれると、XA トランザクションがチェックされ、見つかった場合は、JMS セッションが XA リソースとして自動的に登録されます。これにより、JMS セッションが JMS トランザクションに参加できるようになります。重要JMS トランスポートに XA ConnectionFactory を直接設定することはできません。