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, кажется, все работают на этом маршруте, и маршруты получателей должны проходить в одном и том же контексте транзакции. Я прав?