多个camel路由之间的数据库事务

时间:2015-05-12 04:11:04

标签: apache-camel fuseesb jbossfuse

如何在使用Spring DSL的Camel路由中运行事务并且其中一条路由抛出异常?

如果routeB抛出异常,异常将如何传播回routeA。

如果在routeB中抛出异常,我可以看到transactionalErrorHandler正在处理异常并回滚事务。

在routeB上设置errorHandlerRef="noErrorHandler"没有帮助。

我们怎么做?

我的Camel路线定义:

<route id="routeA">
  <from uri="direct-vm:endpointA" />
  <transacted />
  <to uri="direct-vm:endPointB" />
  <bean ref="beanA" method="save" />
  <onException>
    <exception>java.lang.Exception>
    <handled><constant>true</constant></handled>
    <bean ref="beanA" method="handleError" />
    <rollback markRollbackOnly="true" />
  </onException>
</route>

<route id="routeB">
  <from uri="direct-vm:endPointB" />
  <throwException ref="ex"/>
</route>

1 个答案:

答案 0 :(得分:1)

在camel中,transacted命令只是Spring TransactionTemplate的包装器,因为它将在PlatformTransactionManager提供的事务中登记路由。您在org.apache.camel.spring.spi.SpringTransactionPolicy上获得的唯一配置选项是传播行为,因此处理回滚等必须在事务处理路径中完成。

在这种情况下,您应该从路由B捕获异常,如果它到达错误处理程序,则为时已晚。

<route id="routeA">
    <from uri="direct-vm:endpointA" />
    <transacted/>
    <doTry>
        <to uri="direct-vm:endPointB" />
        <doCatch>
           <exception>java.lang.Exception</exception>
           <bean ref="beanA" method="handleFail"/>
        </doCatch>
        <doFinally>
           <bean ref="beanA" method="save" />
        </doFinally>
    </doTry>
</route>

<route id="routeB">
    <from uri="direct-vm:endPointB" />
    <throwException ref="ex"/>
</route>