具有Splitter并行处理的camel路由中的事务

时间:2015-04-20 02:44:54

标签: java transactions apache-camel jbossfuse apache-servicemix

我们有一个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个客户抛出异常,我会看到多个回滚消息,看起来这似乎正在发生对于每个线程。具有并行处理的camel路由中的事务是否有效?在单个数据库事务中是否还有其他方法可以将客户并行保存到数据库中?

2 个答案:

答案 0 :(得分:3)

不,你不能在同一个交易中做并行工作。工作必须在同一个线程上进行。

答案 1 :(得分:0)

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

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

  

拆分器完成后,它将检查共享工作单元的状态,并检查是否发生任何错误。如果发生错误,它将在Exchange上设置异常并将其标记为回滚。错误处理程序将再次启动,因为Exchange已被标记为回滚,并且也有异常。没有进行任何重新交付尝试(因为它已标记为回退),并且Exchange将移入死信队列。

请参阅链接中的Sharing Unit of work一章。