14.4. 配置 JMS 事务

概述

CXF 3.0 在使用单向消息传递时,支持 CXF 端点上的本地 JMS 事务和 JTA 事务。

本地事务

只有在发生异常时,使用本地资源的事务才会回滚 JMS 消息。它们不直接协调其他资源,如数据库事务。

要设置本地事务,请根据需要配置端点,并将属性 sessionTrasnsacted 设置为 true

注意

有关事务和池的更多信息,请参阅红帽 JBoss Fuse 事务指南

JTA 事务

通过使用 JTA 事务,您可以协调任意数量的 XA 资源。如果为 JTA 事务配置了 CXF 端点,它会在调用服务实施前启动事务。如果没有异常,则事务将被提交。否则,它将被回滚。

在 JTA 事务中,使用 JMS 消息以及写入数据库的数据。发生异常时,两个资源都会回滚,因此消息被消耗,数据就会被写入数据库,或者信息被回滚,不会写入数据库。

配置 JTA 事务需要两个步骤:

  1. 定义事务管理器

    • 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 中查找事务管理器。

  2. 配置 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 提供了 ID ConnectionFactory

    请注意,JcaPooledConnectionFactory 类似于普通的 ConnectionFactory。但是,打开新的连接和会话时,它会检查 XA 事务(如果找到)将 JMS 会话作为 XA 资源注册。这允许 JMS 会话参与 JMS 事务。

    重要

    对 JMS 传输直接设置 XA ConnectionFactory 无法正常工作!