14.4. 配置 JMS 事务
概述 复制链接链接已复制到粘贴板!
CXF 3.0 在使用单向消息传递时,支持 CXF 端点上的本地 JMS 事务和 JTA 事务。
本地事务 复制链接链接已复制到粘贴板!
只有在发生异常时,使用本地资源的事务才会回滚 JMS 消息。它们不直接协调其他资源,如数据库事务。
要设置本地事务,请根据需要配置端点,并将属性 sessionTrasnsacted
设置为 true
。
有关事务和池的更多信息,请参阅红帽 JBoss Fuse 事务指南。
JTA 事务 复制链接链接已复制到粘贴板!
通过使用 JTA 事务,您可以协调任意数量的 XA 资源。如果为 JTA 事务配置了 CXF 端点,它会在调用服务实施前启动事务。如果没有异常,则事务将被提交。否则,它将被回滚。
在 JTA 事务中,使用 JMS 消息以及写入数据库的数据。发生异常时,两个资源都会回滚,因此消息被消耗,数据就会被写入数据库,或者信息被回滚,不会写入数据库。
配置 JTA 事务需要两个步骤:
定义事务管理器
bean 方法
定义事务管理器
<bean id="transactionManager" class="org.apache.geronimo.transaction.manager.GeronimoTransactionManager"/>
<bean id="transactionManager" class="org.apache.geronimo.transaction.manager.GeronimoTransactionManager"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 JMS URI 中设置事务管理器的名称
jms:queue:myqueue?jndiTransactionManager=TransactionManager
jms:queue:myqueue?jndiTransactionManager=TransactionManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个示例找到了 ID
TransactionManager
的 bean。
OSGi 参考方法
使用 Blueprint 将事务管理器作为 OSGi 服务查找
<reference id="TransactionManager" interface="javax.transaction.TransactionManager"/>
<reference id="TransactionManager" interface="javax.transaction.TransactionManager"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 JMS URI 中设置事务管理器的名称
jms:jndi:myqueue?jndiTransactionManager=java:comp/env/TransactionManager
jms:jndi:myqueue?jndiTransactionManager=java:comp/env/TransactionManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例在 JNDI 中查找事务管理器。
配置 JCA 池的连接工厂
使用 Spring 定义 JCA 池的连接工厂:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,第一个 bean 定义了一个 ActiveMQ XA 连接工厂,它被提供给
JcaPooledConnectionFactory
。然后,JcaPooledConnectionFactory
作为默认的 bean 提供了 IDConnectionFactory
。请注意,
JcaPooledConnectionFactory
类似于普通的 ConnectionFactory。但是,打开新的连接和会话时,它会检查 XA 事务(如果找到)将 JMS 会话作为 XA 资源注册。这允许 JMS 会话参与 JMS 事务。重要对 JMS 传输直接设置 XA ConnectionFactory 无法正常工作!