14.4. 配置 JMS 事务
概述
CXF 3.0 在使用单向消息传递时支持 CXF 端点上的本地 JMS 事务和 JTA 事务。
本地事务
只有在发生异常时,使用本地资源的事务才会回滚 JMS 消息。它们不会直接协调其他资源,如数据库事务。
要设置本地事务,请将端点配置为您通常会将属性 sessionTrasnsacted
设置为 true
。
有关事务和池的更多信息,请参阅 Red Hat JBoss Fuse 事务指南。
JTA 事务
使用 JTA 事务时,您可以协调任意数量的 XA 资源。如果为 JTA 事务配置了 CXF 端点,它会在调用服务实施前启动事务。如果没有异常,交易将被提交。否则,它将回滚。
在 JTA 事务中,使用 JMS 消息并写入数据库的数据。发生异常时,两个资源都会回滚,因此信息会被消耗,并且数据写入数据库,或者消息将被回滚,数据也不会写入数据库。
配置 JTA 事务需要两个步骤:
定义事务管理器
bean 方法
定义事务管理器
<bean id="transactionManager" class="org.apache.geronimo.transaction.manager.GeronimoTransactionManager"/>
在 JMS URI 中设置事务管理器的名称
jms:queue:myqueue?jndiTransactionManager=TransactionManager
这个示例发现一个 ID 为
TransactionManager
的 bean。
OSGi 参考方法
使用 Blueprint 将事务管理器作为 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 定义了 ActiveMQ XA 连接工厂,提供给
JcaPooledConnectionFactory
。然后,提供JcaPooledConnectionFactory
作为默认 bean,其 idConnectionFactory
。注意
JcaPooledConnectionFactory
类似于普通的 ConnectionFactory。但打开新连接和会话时,它将检查 XA 事务;如果找到,则会自动将 JMS 会话注册为 XA 资源。这允许 JMS 会话参与 JMS 事务。重要在 JMS 传输上直接设置 XA ConnectionFactory 将无法工作!