如何在使用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>
答案 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>