9.2. 按事务端点划分
如果路由开始时的消费者端点访问资源,则 transacted ()
命令不使用,因为它在交换轮询后启动事务。换句话说,事务开始太晚,以在事务范围内包括消费者端点。在这种情况下,正确的方法是使端点本身负责启动事务。能够管理事务的端点被称为 事务端点。
事务端点有两种不同的模型,如下所示:
常规情况 - 通常,事务端点取消处理事务,如下所示:
- 当交换到达端点时,或者端点成功轮询交换时,端点调用其关联的事务管理器以开始事务。
- 端点会将新事务附加到当前线程。
- 当交换到达路由结束时,事务端点调用事务管理器来提交当前的事务。
- 带有 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