使用 Splitter 并行处理的骆驼路线交易

Transactions in camel routes with Splitter parallel processing

我们有一个 XML 文件,其中包含多个客户元素,我们想使用事务将客户信息保存到数据库中。根据我的理解,事务需要在单个线程中 运行 以在出现错误时回滚整个事务。

这是我的 XML:

<root>
    <customers>
        <customer>...</customer>
        <customer>...</customer>
        <customer>...</customer>
        <customer>...</customer>
    </customers
</root>

这是我的路线:

<route id="routeA">
    <from uri="direct-vm:sample" />
    <transacted />
    <splitter parallelProcessing = "true" stopOnException="true"
            strategyRef="combine" />
    <xpath>/root/customers/customer</xpath>
    <bean ref="customerService" method="saveCustomer" />
    <onException>java.lang.Exception</onException>
    <handled><constant>true</constant></handled>
    <rollback markRollbackOnly="true" />
</route>

方法 saveCustomer() 运行 在将客户保存到数据库之前有很多业务逻辑,如果由于某种原因为 1 或 2 个客户抛出异常,我会看到多个回滚消息,并且似乎每个线程都在发生这种情况。并行处理的骆驼路线交易是否有效?有没有其他方法可以在单个数据库事务中与数据库并行保存客户?

不,您不能在同一个事务中进行并行工作。工作必须发生在同一个线程上。

您可以将 shareUnitOfWork()parallelProcessing 结合使用。

正如 Splitter EIP 的 Camel 文档所述,它将回滚整个工作单元,而不仅仅是子单元:

When the Splitter is done, it checks the state of the shared unit of work and checks if any errors occurred. And if an error occurred it will set the exception on the Exchange and mark it for rollback. The error handler will yet again kick in, as the Exchange has been marked as rollback and it had an exception as well. No redelivery attempts is performed (as it was marked for rollback) and the Exchange will be moved into the dead letter queue.

请参阅 link 中的 Sharing Unit of work 章节。