Camel Split/RecipientList Темы и границы транзакций

В Apache Camel 2.20.2 я создал маршрут с помощью split() и получателей (). Я хотел бы, чтобы весь маршрут и получатели каждой биржи происходили в одной транзакции. Меня смущает, когда Camel будет использовать отдельный поток и границу транзакции. Я прочитал документацию 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 происходят в отдельных транзакциях. Кроме того, кажется, что SelForUpdate.sql и UpdateDateProcessed.sql для Datasource1 происходят в отдельных транзакциях.

У меня вопрос, где новые потоки создаются в этом коде, и где границы транзакций? Как бы я мог добиться этого в контексте одной транзакции?

Читая "Поваренную книгу" разработчика Apache Camel, я понимаю, что шаблоны Split и RecipientList используют один и тот же поток для всей обработки (если не используется параллельная обработка). С созданными бинами SpringTransactionPolicy, кажется, все работают на этом маршруте, и маршруты получателей должны проходить в одном и том же контексте транзакции. Я прав?

0 ответов

Другие вопросы по тегам