骆驼拆分/收件人列表线程和事务边界

时间:2018-07-25 16:11:18

标签: apache-camel spring-transactions camel-sql camel-jdbc

在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,似乎所有工作都在此路由中进行,并且收件人路由应在同一事务上下文中进行。我说得对吗?

0 个答案:

没有答案