Exception handling 发生跨城市提交时,路由级别不捕获异常?

Exception handling 发生跨城市提交时,路由级别不捕获异常?,exception-handling,apache-camel,spring-transactions,Exception Handling,Apache Camel,Spring Transactions,使用Camel 2.13.2。请耐心听我说我的问题: 我有一个子流程,需要跟踪机上订单。主流程使用一个长事务,在长时间验证结束时保存订单信息。如果两个具有相同密钥的订单间隔几秒钟提交,则挂起的订单验证可能不会标记中的最后一个订单。因此,我有一个路由,它使用一个带有Procitation_Requires_new的新事务来持久化机上信息,以补充未决订单验证,直到相关订单信息被提交到下一行: <route id="insertInflightRoute"> <fro

使用Camel 2.13.2。请耐心听我说我的问题:

我有一个子流程,需要跟踪机上订单。主流程使用一个长事务,在长时间验证结束时保存订单信息。如果两个具有相同密钥的订单间隔几秒钟提交,则挂起的订单验证可能不会标记中的最后一个订单。因此,我有一个路由,它使用一个带有Procitation_Requires_new的新事务来持久化机上信息,以补充未决订单验证,直到相关订单信息被提交到下一行:

<route id="insertInflightRoute">
        <from uri="direct-vm:insertInflightEndpoint"/>          
        <transacted ref="PROPAGATION_REQUIRES_NEW" />
java.lang.Exception

当第二个订单尝试插入此机上表时,一旦事务尝试提交,就会引发PK冲突异常。这也很有效

我的问题是,当此路由的事务由于PK冲突而无法提交时,将跳过路由级别。我得到了不太好的PK违规异常,而不是客户看到的可读异常

路由级别是否应该能够处理事务提交期间引起的异常?我认为是这样。。。
我想指出的是,路线级别确实使重新解释符合我的要求,但它基本上是一个窃听,这对我没有好处,因为我需要将重新解释的异常传递给原始线程上的复杂全局错误处理程序。

如果希望路由级别的OneException更改原始exchange/消息,则需要将其设置为处理它,例如handled=true,然后在bean中,您可以在交换上设置一个新的异常,或者抛出一个异常

我有一个解决我问题的变通方案,但并不像我希望的那样理想

我回到了呼叫路线,将数据包在一个包中,并在那里重新解释了我的异常。事务提交失败现在通过从setInflightException bean调用引发异常来按照我希望的方式处理:

        <doTry>
            <!-- insert into inflight mdn table immediately -->
            <to uri="direct-vm:insertInflightEndpoint"/>
        <doCatch>
            <exception>java.sql.SQLException</exception>
            <bean ref="inflightService" method="setInflightException"/>
        </doCatch>
        </doTry>

嘿,克劳斯,谢谢你的回复。我明白你的意思,但我的问题是,当事务在路由末尾提交失败时,不会使用路由级别的OneException。相反,它将进入全局异常处理程序。我想我要问的是,这是否是预期的行为,因为路由级别的onCompletion确实包含事务提交尝试。
        <doTry>
            <!-- insert into inflight mdn table immediately -->
            <to uri="direct-vm:insertInflightEndpoint"/>
        <doCatch>
            <exception>java.sql.SQLException</exception>
            <bean ref="inflightService" method="setInflightException"/>
        </doCatch>
        </doTry>