9.2. 按事务端点划分


如果路由开始时的消费者端点访问资源,则 transacted () 命令不使用,因为它在交换轮询后启动事务。换句话说,事务开始太晚,以在事务范围内包括消费者端点。在这种情况下,正确的方法是使端点本身负责启动事务。能够管理事务的端点被称为 事务端点

Camel route tx 端点

事务端点有两种不同的模型,如下所示:

  • 常规情况 - 通常,事务端点取消处理事务,如下所示:

    1. 当交换到达端点时,或者端点成功轮询交换时,端点调用其关联的事务管理器以开始事务。
    2. 端点会将新事务附加到当前线程。
    3. 当交换到达路由结束时,事务端点调用事务管理器来提交当前的事务。
  • 带有 InOut 交换的 JMS 端点 - 当 JMS 消费者端点收到 InOut 交换,并且此交换路由到另一个 JMS 端点,这必须被视为特殊情况。问题是,如果您尝试在单个事务中包括整个请求/回复交换,则路由可能会死锁。

9.2.1. 带有 JMS 端点的路由示例

第 9.2 节 “按事务端点划分” 显示通过路由开始时存在事务端点(在 from () 命令中)存在的路由示例。所有路由节点都包含在事务范围内。在本例中,路由中的所有端点访问 JMS 资源。

9.2.2. Java DSL 中的路由定义

以下 Java DSL 示例演示了如何通过启动使用事务端点的路由来定义事务路由:

from("jmstx:queue:giro")
        .to("jmstx:queue:credits")
        .to("jmstx:queue:debits");

在上例中,事务范围包含端点 jmstx:queue:giro,jmstx:queue:credits, 和 jmstx:queue:debits。如果事务成功,则会从上级队列永久删除交换,并推送到信用 队列和 去位 队列。如果交易失败,交换不会放入信用队列,并且将交换推送回巨队列。 默认情况下,JMS 会自动尝试更新消息。JMS 组件 bean jmstx 必须明确配置为使用事务,如下所示:

<blueprint ...>
    <bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="jmsConfig" />
    </bean>

    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
        <property name="transactionManager" ref="jmsTransactionManager" />
        <property name="transacted" value="true" />
    </bean>
    ...
</blueprint>

在上例中,jmsTransactionManager 的事务管理器实例 与 JMS 组件关联,transacted 属性设为 true,以启用 InOnly Exchanges 的事务处理。

9.2.3. Blueprint XML 中的路由定义

前面的路由可以在 Blueprint XML 中表示,如下所示:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="jmstx:queue:giro" />
            <to uri="jmstx:queue:credits" />
            <to uri="jmstx:queue:debits" />
        </route>
    </camelContext>

</blueprint>

9.2.4. 不需要 DSL transacted () 命令

在以事务端点开头的路由中不需要 transacted () DSL 命令。但是,假设默认事务策略是 PROPAGATION_REQUIRED (请参阅 第 9.4 节 “事务传播策略”),通常不会损害包含 transacted () 命令,如下例所示:

from("jmstx:queue:giro")
        .transacted()
        .to("jmstx:queue:credits")
        .to("jmstx:queue:debits");

但是,这个路由可能会以意外的方式的行为,例如,如果在 Blueprint XML 中创建了具有非默认传播策略的单一 TransactedPolicy bean。请参阅 第 9.1.4 节 “默认事务管理器和转换的策略”。因此,通常不要将 transacted () DSL 命令包含在以事务端点开头的路由中。

9.2.5. 路由开始时的事务端点

以下 Apache Camel 组件在路由启动时显示为事务端点(例如,如果它们出现在 from () DSL 命令中)。也就是说,这些端点可以配置为充当事务客户端,它们也可以访问事务资源。

  • ActiveMQ
  • AMQP
  • JavaSpace
  • JMS
  • JPA
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.