在Apache Camel 2.20.2中,我创建了一个带有split()和收件人列表()的路由。我希望每个交易所的整个路由和收件人都发生在同一笔交易中。我对骆驼何时使用单独的线程和事务边界感到困惑。我已经阅读了Camel文档,并浏览了网络上的各种文章/论坛。我正在寻找一个明确的答案。
在骆驼中,我有这条路线:
from("seda:process")
.transacted("TRANS_REQUIRESNEW")
.to("sql:classpath:sql/SelForUpdate.sql?dataSource=DataSource1")
.split(body())
.shareUnitOfWork()
.setHeader("transactionId", simple("${body.transactionId}"))
// Datasource 2 updates happening using "direct:xxxx" recipients
.recipientList().method(Routing.class).shareUnitOfWork().end()
.to("sql:classpath:sql/UpdateDateProcessed.sql?dataSource=DataSource1");
在Spring上下文中,我定义了事务管理:
<jee:jndi-lookup expected-type="javax.sql.DataSource" id="Datasource1" jndi-name="jdbc/Datasource1"/>
<jee:jndi-lookup expected-type="javax.sql.DataSource" id="Datasource2" jndi-name="jdbc/Datasource2"/>
<bean id="datasource1TxManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="Datasource1" />
</bean>
<bean id="datasource2TxManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="Datasource2" />
</bean>
<bean id="TRANS_REQUIRESNEW"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager">
<bean id="txMgrRouting"
class="org.springframework.data.transaction.ChainedTransactionManager">
<constructor-arg>
<list>
<ref bean="datasource1TxManager" />
<ref bean="datasource2TxManager" />
</list>
</constructor-arg>
</bean>
</property>
<property name="propagationBehaviorName"
value="PROPAGATION_REQUIRES_NEW" />
</bean>
当我运行路由时,似乎对Datasource1和Datasource2的更新是在单独的事务中进行的。此外,似乎Datasource1的SelForUpdate.sql和UpdateDateProcessed.sql发生在单独的事务中。
我的问题是,此代码在哪里创建新线程,事务边界在哪里?我将如何在一个交易环境中做到这一点?
在阅读Apache Camel开发人员的食谱时,我了解Split和RecipientList模式都对所有处理使用相同的线程(除非使用并行处理)。使用我创建的SpringTransactionPolicy Bean,似乎所有工作都在此路由中进行,并且收件人路由应在同一事务上下文中进行。我说得对吗?