14.4. 配置 JMS 事务


概述

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

本地事务

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

要设置本地事务,请像通常一样配置端点,并将属性 sessionTrasnsacted 设置为 true

注意

有关事务和池的更多信息,请参阅 Red Hat JBoss Fuse Transaction Guide

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 将无法正常工作!

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.